MySQL NOT NULL 插入行为

MySQL NOT NULL insert behavior

我目前正在使用 MySQL 5.5,想升级到 5.6 或 5.7。 但是我 运行 进入 st运行ge 行为(可能是 mysql 错误或一些全局默认变量)。 以下代码适用于 5.5,但不适用于 5.6、5.7。 所以要么 5.5 有问题,要么我缺少 5.6/5.7 的一些设置。

create table null_test( not_null VARCHAR(255) NOT NULL);
insert into null_test values();

不出所料,以下操作无效。

insert into null_test values(NULL); 

根据一些早期的挖掘,它可能与 SQL 模式有关,尤其是 ER_NO_DEFAULT_FOR_FIELD。

https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-full

这是 Strict SQL mode 在较新的 MySQL 版本中默认启用的结果。

禁用严格模式时,省略声明为 NOT NULL 且没有显式 DEFAULT 值的列的值会产生警告并假定自动默认值。对于 VARCHAR,此自动默认值为空字符串。

启用严格模式时,除非您使用 INSERT IGNORE.

,否则此条件会导致错误

没有特定的 SQL 模式可以控制此行为;如果你想关闭这个检查,你需要完全禁用严格模式。由于严格模式可能会产生其他不兼容问题(例如 ONLY_FULL_GROUP_BY 错误),这可能是您处理迁移的最便捷方式。

但是如果你只是想处理这个特定的错误,最好的解决方案是在模式中声明一个显式默认值:

create table null_test(not_null VARCHAR(255) NOT NULL DEFAULT '');