MySQL转换DECIMAL类型时为何上报row -1位置及空列的错误?
问题底层逻辑说明
1. row -1 行号的由来
MySQL的正整数行号仅在表级DML操作(INSERT/UPDATE/DELETE等逐行修改表数据的流程) 中分配,你遇到的报错来自SELECT语句内CAST函数的表达式求值阶段,不属于逐行修改表数据的流程,没有对应实际表行的行号,MySQL错误上报逻辑会统一用-1作为这类非表行操作错误的占位符,并非真的存在编号为-1的行。
2. 关联列名为空的由来
该错误是CAST函数做即时类型转换时内部抛出,既不是对原表source_value列的写入校验错误,也不会关联你给计算列设置的别名dec_val,MySQL表达式求值阶段的转换错误不会绑定具体的表字段,所以会用空字符串作为列名占位符。
3. 不同值触发不同警告的逻辑
MySQL字符串转DECIMAL采用分层校验规则:
- 若字符串完全没有合法数字前缀(空字符串、纯字母
'B'等):系统会先触发1366警告,提示无合法DECIMAL值,默认降级使用0作为兜底值,再额外触发1292警告提示原值被截断为0 - 若字符串开头存在合法数字前缀(如
'5 1/2'、'5ABCD'开头的5是合法数字):系统仅会截断保留前缀的合法数字部分,只会触发1292截断警告,无需降级兜底,因此不会触发1366警告
复现场景对应逻辑
你执行的SQL流程完全匹配上述规则:
-- 建表 CREATE TABLE `temp_test_dec` ( `source_value` varchar(255) NOT NULL DEFAULT '', KEY `source_value` (`source_value`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 插入空字符串 INSERT INTO `temp_test_dec` VALUES(''); -- 执行CAST转换 SELECT CAST(source_value AS DECIMAL(9,3)) as dec_val FROM `temp_test_dec`;
执行后返回的警告完全符合校验规则:
+---------+------+------------------------------------------------------+ | Level | Code | Message | +---------+------+------------------------------------------------------+ | Warning | 1366 | Incorrect DECIMAL value: '0' for column '' at row -1 | | Warning | 1292 | Truncated incorrect DECIMAL value: '' | +---------+------+------------------------------------------------------+
内容的提问来源于stack exchange,提问作者Buttle Butkus
相关产品推荐
相关产品推荐

