我目前正在使用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
答案 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 '');