MySQL字符串拼接触发Truncated incorrect DOUBLE value报错
问题根因
这是SQL Server迁移MySQL最常见的语法差异坑:
- SQL Server中
+运算符同时支持数值加法、字符串拼接两种语义,但在MySQL里+仅做数值加法使用,原生不支持字符串拼接功能。 - 当你执行
@Loc + ' - ' + @Loc时,MySQL会自动尝试把所有操作数转换为DOUBLE类型做算术计算:字符串'xxx'、' - '无法转换为合法数值,就会抛出你看到的三条「Truncated incorrect DOUBLE value」警告,转换失败的字符串会被默认当作0处理,最终计算结果为0+0+0=0,和你实际运行得到的返回结果完全一致。
解决方案
MySQL实现字符串拼接有两种常用方案,优先推荐第一种:
- 使用内置
CONCAT()函数(全版本兼容,无兼容风险)
把需要拼接的字段、字符串按顺序作为CONCAT()的传入参数即可,修改后的可正常运行代码如下:
执行后会正确返回拼接结果SET @Loc = 'xxx'; SET @RegionName = ''; SET @RegionName = CONCAT(@Loc, ' - ', @Loc); SELECT @RegionName;xxx - xxx,无任何警告。 - 开启
PIPES_AS_CONCATSQL模式(适合习惯用运算符拼接的场景)
如果你更习惯用运算符做拼接、不想大量改代码,可以在会话级开启该模式,之后就可以用标准SQL的||运算符做字符串拼接,写法和SQL Server里的+逻辑一致:-- 仅对当前会话生效,不影响其他连接 SET SESSION sql_mode = 'PIPES_AS_CONCAT'; SET @Loc = 'xxx'; SET @RegionName = ''; SET @RegionName = @Loc || ' - ' || @Loc; SELECT @RegionName;
注意:不建议在生产环境修改全局SQL模式适配语法,
CONCAT()是跨版本、跨环境最稳定的方案,迁移时批量替换+拼接为CONCAT()即可。
内容的提问来源于stack exchange,提问作者spacedog
相关产品推荐
相关产品推荐

