【问题标题】:MySQL NOT NULL insert behaviorMySQL NOT NULL 插入行为
【发布时间】:2018-11-10 22:39:57
【问题描述】:

我目前正在使用 MySQL 5.5 并希望升级到 5.6 或 5.7。 但是我遇到了奇怪的行为(可能是 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 MODE 有关,尤其是 ER_NO_DEFAULT_FOR_FIELD。

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

【问题讨论】:

  • 可能可以简单地通过明确地给该字段一个默认值来解决。
  • 我知道如何解决它。但我试图理解它为什么会发生。还有一个针对 5.5 运行的大型现有应用程序。只是不能更改每个查询以针对新版本的 mysql 进行测试。我知道这是我必须经历的痛苦,但这不是目前的解决方案。
  • 您不需要更改应用程序。只需将表格列更改为DEFAULT ''
  • 我的意思是在将数据库迁移到较新的服务器版本时,可以更新表定义以指定默认值。我的猜测是,在不可为空的 varchar 字段上可能有一些模糊的服务器设置/选项用于将空值默认为空字符串,但我认为仅更新架构可能会更快。如果添加了这样的选项,并且默认为该状态,则 MySQL 可能正在迁移该隐含行为,或者可能新的优化正在使其成为首选行为。

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


【解决方案1】:

这是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 '');

【讨论】:

    猜你喜欢
    • 2020-03-22
    • 2017-05-08
    • 2012-10-03
    • 2016-06-15
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多