MySQL NOT NULL插入行为

时间:2018-05-31 20:35:15

标签: mysql mysql-5.7 mysql-5.6 mysql-5.5

我目前正在使用MySQL 5.5并希望升级到5.6或5.7。 但是我遇到了奇怪的行为(可能是mysql bug或一些全局默认变量)。 以下代码适用于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 MODE有关,尤其是ER_NO_DEFAULT_FOR_FIELD。

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

1 个答案:

答案 0 :(得分:1)

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

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

启用严格模式后,除非您使用INSERT IGNORE,否则此情况会导致错误。

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

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

create table null_test(not_null VARCHAR(255) NOT NULL DEFAULT '');
相关问题