【问题标题】:mysql error 1292 when using cast in update statement在更新语句中使用强制转换时 mysql 错误 1292
【发布时间】:2014-01-15 16:03:46
【问题描述】:

以下语句返回“错误代码: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)。

【问题讨论】:

  • 请显示表结构
  • emp的数据类型是varchar(7)

标签: mysql truncated


【解决方案1】:

试试这个

update IGNORE new2006 set new2006.emp=cast(emp as unsigned) where IsNum(emp)=0;

【讨论】:

    【解决方案2】:

    你是严格的SQL mode;如文件所述(强调):

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

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

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

    【讨论】:

      【解决方案3】:

      很容易复制,例如:

      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 根据输入场景选择不同的算法或内部变量类型,有时在执行内部计算时会发生截断。

      【讨论】:

        猜你喜欢
        • 2011-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多