MariaDB拼接INSERT语句报错‘Truncated incorrect DOUBLE value’求助
问题原因与解决方案
错误根源
报错的核心原因是MariaDB默认不把||当作字符串连接符,而是逻辑或(OR)运算符。当你用||拼接字符串时,数据库会尝试将这些字符串转换为整数/双精度数值进行逻辑运算,转换失败就会抛出"截断错误"。虽然最终SELECT结果看似正常,但底层类型转换过程中已经触发了警告/错误。
解决方案
方案1:改用CONCAT()函数拼接字符串(推荐)
直接使用MariaDB标准的字符串连接函数CONCAT()替代||,彻底避免类型转换问题。修正后的SQL如下:
SELECT CONCAT( 'INSERT INTO MY_DB_RESOURCE_USAGE (REG_DT) VALUES (''', reg_dt, ''');' ) FROM ( SELECT CONVERT(DATE_FORMAT(NOW(), '%Y%m%d:%H'), CHAR) AS reg_dt ) AS tt;
你还可以简化不必要的嵌套子查询,进一步优化SQL:
SELECT CONCAT( 'INSERT INTO MY_DB_RESOURCE_USAGE (REG_DT) VALUES (''', CONVERT(DATE_FORMAT(NOW(), '%Y%m%d:%H'), CHAR), ''');' );
方案2:临时开启PIPES_AS_CONCAT模式
如果坚持使用||作为连接符,可以在执行SQL前临时开启会话级别的PIPES_AS_CONCAT模式,让MariaDB将||识别为字符串连接符:
SET sql_mode = 'PIPES_AS_CONCAT'; SELECT 'INSERT INTO MY_DB_RESOURCE_USAGE (REG_DT) VALUES ('''||reg_dt||''');' FROM ( SELECT CONVERT(DATE_FORMAT(NOW(), '%Y%m%d:%H'), CHAR) AS reg_dt ) AS tt;
注意:该设置仅对当前会话有效,不会影响全局配置;如果是批处理执行,需要确保这条SET语句和查询语句在同一个会话中运行。
内容的提问来源于stack exchange,提问作者JAEYUN LEE
相关产品推荐
相关产品推荐

