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

MySQL JSON字符串转DOUBLE丢失精度:原因及批量存储方案咨询

解答

1. 精度丢失的根本原因

MySQL解析JSON字符串字面量时,会将其中的数值通过字符串转浮点数的逻辑处理,这个过程依赖底层C标准库的strtod()函数实现。尽管1.9242262540021347是合法双精度值,但字符串形式的数值在转换为二进制浮点数时,C库的解析逻辑无法精准映射到对应的双精度二进制表示,最终存储的是最接近的近似值,表现为末尾数字变化。

而使用JSON_OBJECT插入时,是直接将MySQL内部的DOUBLE类型值写入JSON列,跳过了字符串转浮点数的步骤,因此能完整保留双精度的原生精度。

2. 无需反序列化的存储方法

针对已有的序列化JSON数据,无需反序列化重新构造JSON_OBJECT的解决方案如下:

  • 用JSON函数直接替换目标数值字段:如果已知JSON中需要保留精度的字段名,可通过JSON_SET或JSON_REPLACE传入原生DOUBLE值覆盖错误值。比如从同表的DOUBLE列取值替换,无需解析整个JSON结构:
    UPDATE example_table 
    SET json_column = JSON_SET(json_column, '$.a', double_column) 
    WHERE id = 1;
    
  • 将JSON存储为文本类型:如果业务不需要使用MySQL的JSON查询、索引等功能,可将JSON数据存储为LONGTEXT或MEDIUMTEXT类型,完全保留原始序列化字符串,避免MySQL解析JSON时的类型转换操作。
  • 批量导入时指定精确转换逻辑:如果是批量导入已有JSON数据,可使用LOAD DATA INFILE,在导入过程中提取数值字段并以DOUBLE类型处理后,再构造JSON写入;也可以借助用户定义函数(UDF)实现字符串到DOUBLE的精确转换,避免默认解析的精度损失。
  • 将JSON中的数值以字符串形式存储:修改序列化逻辑,把需要保留精度的数值用引号包裹为字符串类型存入JSON,后续业务层需要计算时再转为DOUBLE类型。这种方式无需修改存储结构,只需调整序列化规则。

内容的提问来源于stack exchange,提问作者dacapo1142

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:04:52