You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类型,错误地将小数部分截断;或者是驱动在处理浮点字段时的默认配置有问题,把带小数的数值当成了整数处理。

解决方案

我给你几个逐步排查和解决的方法:

  1. 优先更新mariadb Python驱动
    旧版本的驱动经常会有类型映射的bug,先把驱动更到最新版试试:
pip install --upgrade mariadb
  1. 在数据库连接中添加初始化命令,强制浮点类型处理规则
    在建立连接时,通过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当成浮点处理
)
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 14:22:59