Python读取MariaDB的double类型字段时数据被向下取整导致精度丢失
Python读取MariaDB的double类型字段时数据被向下取整导致精度丢失
看起来你遇到的问题确实很棘手——明明DBeaver里能看到gridE_tot字段存储的是0.0911、0.103这类带小数的数值,但通过Python的mariadb驱动读取后,数值却被截断成了0.0,连计算1000*line[1]都得到0.0,这显然是驱动在类型映射上出了问题。
可能的原因
这种情况通常是因为mariadb Python驱动版本过旧,存在浮点类型解析的bug,导致无法正确识别MariaDB的double类型,错误地将小数部分截断;或者是驱动在处理浮点字段时的默认配置有问题,把带小数的数值当成了整数处理。
解决方案
我给你几个逐步排查和解决的方法:
- 优先更新mariadb Python驱动
旧版本的驱动经常会有类型映射的bug,先把驱动更到最新版试试:
pip install --upgrade mariadb
- 在数据库连接中添加初始化命令,强制浮点类型处理规则
在建立连接时,通过init_command参数设置会话的SQL模式,确保驱动正确解析浮点类型:
conn_verbruik = mariadb.connect( host=mariadb_host, user='xxxxx', password='xxxxx', database=mariadb_db_verbruik, init_command="SET sql_mode = 'REAL_AS_FLOAT'" # 新增该行,强制把REAL/DOUBLE当成浮点处理 )
- 在SQL查询中显式转换字段类型
如果更新驱动和设置连接参数都没效果,可以在查询时把gridE_tot显式转换为高精度小数类型,绕过驱动的类型解析问题:
# 修改SQL语句,用CAST强制转换类型 sql = f"SELECT time, CAST(gridE_tot AS DECIMAL(10,4)) as gridE_tot, 1000*gridE_tot as test from periode15 ORDER BY time DESC LIMIT 5"
DECIMAL(10,4)表示总长度10位,保留4位小数,刚好匹配你存储的数值精度。
测试验证
按照上面的方法修改后,重新运行代码,应该能得到和DBeaver里一致的结果:
比如第一行应该输出:
(1737210600, 0.0911, 91.1) 91.1
如果还是有问题,也可以尝试换用pymysql驱动连接MariaDB(MariaDB兼容MySQL协议),看看是否能正常读取数值,以此排除驱动本身的问题。
备注:内容来源于stack exchange,提问作者Bart De Wit
相关产品推荐
相关产品推荐

