启用严格模式后,MySQL 允许零日期(0000-00-00 00:00:00)

启用严格模式后,MySQL 允许零日期(0000-00-00 00:00:00)

我想配置一个 MySQL db 实例不接受零日期(0000-00-00 00:00:00),因为如果遇到这样的字段,在其上运行的软件将无法运行。

该服务器正在运行 MySQL 版本 5.5.40。

我在 my.cnf 文件的 [mysqld] 部分添加了以下几行:

sql-mode="NO_ZERO_DATE,NO_ZERO_IN_DATE"
innodb_strict_mode="ON"

重新启动后,如果我从命令行检查,我会得到以下内容:

mysql> SELECT @@GLOBAL.sql_mode;
+------------------------------+
| @@GLOBAL.sql_mode            |
+------------------------------+
| NO_ZERO_IN_DATE,NO_ZERO_DATE |
+------------------------------+
1 row in set (0.00 sec)

mysql> SELECT @@GLOBAL.innodb_strict_mode;
+-----------------------------+
| @@GLOBAL.innodb_strict_mode |
+-----------------------------+
|                           1 |
+-----------------------------+
1 row in set (0.00 sec)

但是如果我使用客户端应用程序连接到数据库并尝试填写零日期,它仍然有效。我尝试重新创建数据库,仍然没有成功。有人知道这是为什么吗?

谢谢。

答案1

通过阅读MySQL 服务器模式文档

MySQL 服务器可以在不同的 SQL 模式下运行,并可以根据 sql_mode 系统变量的值针对不同的客户端应用不同的模式。DBA 可以设置全局 SQL 模式以匹配站点服务器的运行要求,并且每个应用程序都可以根据自己的要求设置其会话 SQL 模式。

后来

设置 GLOBAL 变量需要 SUPER 权限,并且会影响从那时起连接的所有客户端的操作。设置 SESSION 变量仅影响当前客户端。每个客户端都可以随时更改其会话 sql_mode 值

基本上,配置文件中的设置仅控制默认值。如果各个客户端和应用程序愿意努力设置会话设置,它们仍然可以自由地做任何它们想做的事情。如果您打开,general_log您实际上可以在客户端连接和运行查询时看到这种情况发生。

另外,我认为验证数据的责任应该由应用程序代码承担,而不是数据存储。你在你的整个应用程序结构中添加一层薄薄的层,以确保INSERTS符合你的要求。

相关内容