在更新语句中使用强制转换时出现mysql错误1292

时间:2014-01-15 16:03:46

标签: mysql truncated

以下语句返回“错误代码:1292。截断错误的INTEGER值:'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)。

3 个答案:

答案 0 :(得分:2)

试试这个

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators import PythonOperator
from datetime import datetime, timedelta
from mycalculator import *

dag = DAG(
    dag_id='project1', default_args=args,
    schedule_interval="@once")

答案 1 :(得分:1)

你是严格的SQL mode;记录(重点补充):

  

严格模式控制MySQL如何处理INSERTUPDATE等数据更改语句中的无效或缺失值。由于多种原因,值可能无效。例如,列可能具有错误的数据类型,或者可能超出范围。当要插入的新行不包含其定义中没有明确NULL子句的非DEFAULT列的值时,缺少值。 (对于NULL列,如果缺少值,则会插入NULL。)

     

对于不更改数据的语句,例如SELECT,无效值会在严格模式下生成警告,而不是错误。

如果希望UPDATE成功而没有错误,则需要更改为非严格的SQL模式,否则首先将字符串操作为不会引发错误的值,例如: SUBSTRING_INDEX(emp, '.', 1)

答案 2 :(得分:-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');

我在manual page for CAST()中找不到任何能够揭示这个主题的内容。我的猜测是MySQL根据输入场景选择不同的算法或内部变量类型,有时在执行内部计算时会发生截断。