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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:18:01