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

rho*_*son 25 php mysql

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

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

update()create()方法被设计为从拉protected static $db_fields在每个类的顶部声明属性阵列,它包含了所有在该表中使用的字段.update()create()通过该数组和运行任何INSERT INTOUPDATE在SQL中,相应.

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

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

lon*_*eck 32

''并且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
Run Code Online (Sandbox Code Playgroud)

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

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