我有一个表定义为
CREATE TABLE `flagged` (
`id` int(4) DEFAULT NULL,
`flag` ENUM('A','B') DEFAULT NULL
);
执行时
INSERT INTO `flagged` VALUES (1,'A'),(2,'B'),(3,NULL),(4,'');
我收到以下警告:
Query OK, 4 rows affected, 1 warning (0.02 sec)
Records: 4 Duplicates: 0 Warnings: 1
Warning (Code 1265): Data truncated for column 'flag' at row 4
鉴于数据是备份的结果(一个相当大的数据),我无法轻易操作 INSERT 命令。
我想避免报告这种特殊情况,但仍会收到有关可能出现的任何其他问题的警告。
最佳答案
Mysql的enum数据类型可以有2 different empty (not null) value :
允许的一个普通的(可选)
一个错误值,表示在该字段中插入了不正确的值。这是枚举数据类型的固有行为。
区分这两个空值的唯一方法是索引:错误空值的索引为0;常规值将具有非零值。
在您的情况下,普通枚举列表不包含空值,并且关闭了严格的 sql 模式。因此,当您将空值取消插入枚举时,mysql 会检测到它不在列表中。由于关闭了严格的 sql 模式,mysql 仅发出警告并将该值设置为错误空字符串(索引 0)。您可以通过在查询中将枚举值转换为 int 来轻松检查这一点。
您有 2 个选项可以专门消除这些警告。这两种选择都有缺点,因此您应该仔细考虑您的操作。您甚至可以决定不理会警告(这就是我会做的)。
将空字符串添加到枚举列表中。缺点是空值的索引号会发生变化,并且可能会干扰对枚举字段进行的任何排序或过滤。
使用 before insert 触发器将空白值转换为 null。同样,这可能会干扰任何排序或过滤,也可能会减慢导入过程。
您必须检查源系统中如何处理空白值,并且必须评估应用程序是否有任何查询会受到所选方法的影响。
关于mysql - 如何避免 MySQL 警告 #1265。列的数据被截断...,当在列表中插入默认为 NULL 的空字符串时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43549386/