mysql - 如何避免 MySQL 警告 #1265。列的数据被截断...,当在列表中插入默认为 NULL 的空字符串时?

标签 mysql

我有一个表定义为

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 :

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

  2. 一个错误值,表示在该字段中插入了不正确的值。这是枚举数据类型的固有行为。

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

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

您有 2 个选项可以专门消除这些警告。这两种选择都有缺点,因此您应该仔细考虑您的操作。您甚至可以决定不理会警告(这就是我会做的)。

  1. 将空字符串添加到枚举列表中。缺点是空值的索引号会发生变化,并且可能会干扰对枚举字段进行的任何排序或过滤。

  2. 使用 before insert 触发器将空白值转换为 null。同样,这可能会干扰任何排序或过滤,也可能会减慢导入过程。

您必须检查源系统中如何处理空白值,并且必须评估应用程序是否有任何查询会受到所选方法的影响。

关于mysql - 如何避免 MySQL 警告 #1265。列的数据被截断...,当在列表中插入默认为 NULL 的空字符串时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43549386/

相关文章:

php - 如何在一个查询中从三个表中进行选择

php - 奇怪的数据库问题! PHP MySQL 代码点火器

php - MySQL 查询中表名周围反引号的重要性

mysql - MySQL 中 INSERT INTO 和 LOAD DATA from CSV 的区别

php - 设置结果并在一个 if 中检查行数

mysql - 数据库查询返回条件 1=true 单独或条件 2=true 单独的记录,但不返回条件 1 和条件 2=true 共同时的记录

mysql - 计算左联合表中的非空值

mysql - SQL 与总字段的交集计数

mysql - Grails:文本而不是 varchar

php - 如何在 CakePHP 查找查询中正确嵌套自定义字段?