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

2022-08-30 15:42:47

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

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

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

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

这就是我收到“数据被截断”错误的原因吗?这似乎不同 - 我以前没有见过截断的错误,这就是为什么我来找你们天才。谢谢。


答案 1

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

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

要么插入显式 s,要么甚至不要在插入中指定列。null

当您更新时,您可以发送您拥有的所有值,因为mysql将自动忽略未更改的值。


答案 2

这并不意味着一个解决方案,而只是为了对问题有更多的了解。

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

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

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

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

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


推荐