2017-04-21 23 views
1

我有一个表定义为如何避免MySQL警告#1265。数据截断列...,当在默认NULL列表上插入空字符串?

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命令。

我想避免这种特殊情况的报告,但仍会收到任何其他可能出现的问题的警告。

+0

您的'ENUM'不允许使用空字符串。也许它被压缩到'NULL'? – tadman

+0

**无声**压扁到'NULL'将是我的预期行为。 但它既不沉默也不被压缩为NULL,但被接受。我怀疑原始数据库是允许那些空的非空值,然后导致这些警告。 –

+0

MySQL过去曾经默默地做过很多事情,但是更新的版本已经开始将这些事情表现为警告和错误。这取决于您的服务器设置,并且一些默认设置被设置为更严格。很多人对MySQL非常鄙视,因为它会默默地做这样的事情,没有任何警告,最终会摧毁大量的数据。最好不要被警告和忽略,否则永远不会知道它要做什么。 – tadman

回答

0

MySQL的枚举数据类型可以具有2 different empty (not null) value

  1. 一个普通的一个在允许的一个(可选)列出

  2. 指示不正确的值插入到该字段的误差值。这是枚举数据类型的内在行为。

区分两个空值的唯一方法是索引:错误空值具有索引0;常规值将具有非零值。

在你的情况下,普通的枚举列表不包含空值,并且严格的sql模式被关闭。因此,当你在枚举中插入一个空值时,mysql检测到它不在列表中。由于严格sql模式被关闭,mysql只会引发警告,并将该值设置为错误的空字符串(索引0)。您可以通过在查询中将枚举值转换为int来轻松检查。

您有2个选项可以专门去除这些警告。这两个选项都有缺点,所以你应该仔细考虑你做了什么。你甚至可以决定只留下警告(这是我会做的)。

  1. 将空字符串添加到枚举的列表中。缺点是空值的索引号会改变,并可能干扰枚举字段上的任何排序或筛选。

  2. 在插入触发器之前使用将空值转换为空值。同样,这可能会干扰任何分类或筛选,并且可能会减慢导入过程。

必须检查空值是如何在源系统处理,如果应用程序有将被选择的方法会影响任何疑问,必须进行评估。

相关问题