MySQL更新重量字段统一格式时DOUBLE值截断报错如何解决
报错原因
该报错是MySQL严格SQL模式导致的执行差异:
- 执行SELECT查询时,
weight + 0触发隐式类型转换,字符串开头的数字会被转为DOUBLE类型,后续非数字字符被截断,这个过程仅会生成警告,不会终止语句执行,所以可以拿到正常的查询结果。 - 执行UPDATE写入操作时,默认开启的
STRICT_TRANS_TABLES模式会将类型转换阶段的截断警告升级为错误直接抛出,你收到的Truncated incorrect DOUBLE value: '200 г'就是该规则的触发结果。
正确批量更新方案
推荐使用更稳妥的数字提取逻辑实现格式统一,不需要修改SQL配置,兼容所有常见MySQL版本:
UPDATE t SET weight = CONCAT(CAST(weight AS UNSIGNED), ' г');
如果是MySQL 8.0及以上版本,也可以用正则明确提取前缀数字,逻辑可读性更强:
UPDATE t SET weight = CONCAT(REGEXP_SUBSTR(weight, '^\\d+'), ' г');
如果坚持要使用原有隐式转换逻辑,可以临时修改当前会话的SQL模式关闭严格校验,执行完更新后可自行恢复原有配置:
-- 临时关闭当前会话的严格事务表模式 SET SESSION sql_mode = REPLACE(@@sql_mode, 'STRICT_TRANS_TABLES', ''); -- 执行原有更新语句 UPDATE t SET weight = CONCAT((weight + 0), ' г');
内容的提问来源于stack exchange,提问作者Slava Rozhnev
相关产品推荐
相关产品推荐

