以下语句返回“错误代码:1292。截断不正确的整数值:'95.00' 1.132 秒”
update new2006 set new2006.emp=cast(emp as unsigned) where IsNum(emp)=0;
但是如果我使用下面的语句,我可以成功得到结果 95。
select cast(emp as unsigned) from new2006 where IsNum(emp)=0;
PS:emp的数据类型是varchar(7)。
尝试这个
update IGNORE new2006 set new2006.emp=cast(emp as unsigned) where IsNum(emp)=0;
您处于严格的SQL 模式;如文件所述(强调添加):
严格模式控制 MySQL 如何处理数据更改语句中的无效或缺失值,例如
INSERT
orUPDATE
。一个值可能由于多种原因而无效。例如,它可能具有错误的列数据类型,或者可能超出范围。NULL
当要插入的新行不包含定义中没有显式DEFAULT
子句的非列的值时,缺少值。(对于一NULL
列,NULL
如果缺少值,则插入。)对于不更改数据的语句,例如
SELECT
,无效值会在严格模式下生成警告,而不是错误。
如果您希望UPDATE
成功而没有错误,则需要更改为非严格的 SQL 模式,或者首先将字符串操作为不会引发错误的值,例如SUBSTRING_INDEX(emp, '.', 1)
.
它很容易重现,例如:
CREATE TABLE new2006 (
emp VARCHAR(7)
);
INSERT INTO new2006 (emp) VALUES ('95.00');
UPDATE new2006 SET emp=CAST(emp AS UNSIGNED);
我怀疑这个问题与从/到基数 2 的内部转换有关,因为当您转换为 DECIMAL 时没有错误消息:
UPDATE new2006 SET emp=CAST(emp AS DECIMAL);
...或者当您从源数据中删除小数时:
INSERT INTO new2006 (emp) VALUES ('95');
我在CAST() 的手册页中找不到任何可以阐明该主题的内容。我的猜测是 MySQL 根据输入场景选择不同的算法或内部变量类型,有时在执行内部计算时会发生截断。