首页 文章

这个错误是什么? “数据库查询失败:第1行的'column_name'列数据被截断

提问于
浏览
25

我正在构建一个PHP / MySQL应用程序,我遇到了创建和更新查询的问题 . 我有5列设置为FLOAT类型,也设置为NULL列 . 我不打算在工作流程的后期填写它们 .

但是,我需要为这个数据库创建新的记录,我需要编辑现有的记录,而不需要触及这5个浮点字段 . 我正在使用OOP PHP,它使用标准的 save() 方法来检查对象中是否存在ID . 如果没有,则调用 create() ,如果是,则调用 update() . 它通常很有效 .

update()create() 方法旨在从每个类顶部声明的 protected static $db_fields 属性数组中提取,该数组包含该表中使用的所有字段 . update()create() 相应地运行该数组以及SQL中的 INSERT INTOUPDATE .

我的理解是,如果你使用 '' (两个单引号,空),SQL将跳过那些 INSERT INTOUPDATE 请求并将它们保留为NULL . 页面上任何位置的5个浮点值都没有表单字段,因此当方法运行时,值将为 '' .

这就是我收到“数据截断”错误的原因吗?它似乎有所不同 - 我之前没有看到过截断的错误,这就是为什么我要来找天才 . 谢谢 .

3 回答

  • 2

    ''null 不一样 . 如果您的mysql服务器处于严格模式,那么它将拒绝执行插入,因为您已经为该列传递了无效数据 . 没有严格模式,它会返回一个警告 .

    mysql> create table a (a float not null);
    Query OK, 0 rows affected (0.11 sec)
    
    mysql> insert a values ('');
    Query OK, 1 row affected, 1 warning (0.05 sec)
    
    mysql> show warnings;
    +---------+------+----------------------------------------+
    | Level   | Code | Message                                |
    +---------+------+----------------------------------------+
    | Warning | 1265 | Data truncated for column 'a' at row 1 |
    +---------+------+----------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> set sql_mode = 'STRICT_ALL_TABLES';
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert a values ('');
    ERROR 1265 (01000): Data truncated for column 'a' at row 1
    

    插入显式 null ,或者甚至不指定插入中的列 .

    当你更新时,你可以发送你拥有的所有值,因为mysql会自动忽略未更改的值 .

  • 1

    这不是一个解决方案,而只是为了解决这个问题 .

    如果将关键字IGNORE添加到语句中,并尝试将''(或任何不以数字开头的字符串)插入float列,MySQL将插入值0,而不是默认值 .

    INSERT IGNORE INTO a_table (float_column) VALUE ('')
    
    INSERT IGNORE INTO a_table (float_column) VALUE ('abc')
    

    即使默认值为null,两者都将插入0 . 当然,如果没有IGNORE,这两个语句都会引发您所看到的错误 .

    简而言之,您收到消息是因为您提供的数据既不是预期类型也不是默认值 .

  • 31

    如果您不打算INSERT数据,它不应该在SQL语句中 .

    例如,假设您有一个表“Data”,其中包含id,float1,float2,float3和float4,Float5,您只需添加ID . INSERT应如下所示:

    INSERT INTO `Data` ( `id` )
    VALUES ( 'Some-ID-Value' )
    

    如果浮动被定义为接受 NULL ,则它们将被默认为 NULL . 对于UPDATE语句也是如此,您应该只列出要更改的字段 .

相关问题