我的表定义为
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
鉴于数据是备份的结果(一个很大的数据(,我无法轻易操纵插入命令。
我想避免报告这种特殊情况,但仍然会警告可能出现的任何其他问题。
mysql的枚举数据类型可以具有2个不同的空(不是null(值:
-
在允许的一个(可选(
中列出的普通 误差值表示错误的值已插入该字段。这是枚举数据类型的内在行为。
区分两个空值的唯一方法是索引:错误空值具有索引0;常规值将具有非零值。
在您的情况下,普通枚举列表不包含空值,并且严格的SQL模式被关闭。因此,当您在枚举上取消一个空值时,MySQL会检测到它不在列表中。由于严格的SQL模式被关闭,因此MySQL仅发出警告,并且该值设置为错误的空字符串(索引0(。您可以通过将枚举值转换为查询中的int来轻松检查此。
您有2个选项,以摆脱这些警告。这两个选项都有缺点,因此您应该仔细考虑自己的工作。您甚至可能决定不理警告(这就是我要做的(。
-
将空字符串添加到枚举列表中。缺点是空值的索引数将改变,并且可能会干扰枚举字段上的任何排序或过滤。
-
在插入触发器之前使用将空白值转换为null。同样,这可能会干扰任何分类或过滤,也可能会减慢导入过程。
您必须检查源系统中的空白值的处理方式,并且必须评估应用程序是否具有受选方法影响的任何查询。