我想configuration一个MySQL数据库实例不接受零date(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)
但是,如果我连接到数据库的客户端应用程序,并尝试填写零date,它仍然工作。 我试图重新创build数据库,仍然没有运气。 任何想法,为什么这是?
谢谢。
从阅读MySQL服务器模式的文档 :
MySQL服务器可以在不同的SQL模式下运行,并且可以根据sql_mode系统variables的值对不同的客户端应用不同的模式。 DBA可以设置全局SQL模式以匹配站点服务器操作需求,并且每个应用程序可以将其会话SQL模式设置为自己的需求。
并在稍后
设置GLOBALvariables需要SUPER权限,并影响从此时开始连接的所有客户端的操作。 设置SESSIONvariables仅影响当前客户端。 每个客户端可以随时更改其会话sql_mode的值
基本上,configuration文件中的设置只能控制默认设置。 如果他们愿意设置会话设置,个人客户和应用程序仍然可以自由地做任何他们想做的事情。 如果打开general_log ,则可以在客户端连接并运行查询时实际观察这种情况。
另外,我认为validation数据的责任应该在应用程序代码中,而不是在数据存储中。 您可以为整个应用程序结构添加一个薄层,以确保INSERTS符合您的要求。