我希望在 MySQL 中允许零日期。我已更改sql_mode为ALLOW_INVALID_DATES,NO_ENGINE_SUBSTITUTION.
我已经在/etc/mysql/my.cnf.
但是,当我尝试插入数据时出现错误,
数据截断:日期时间值不正确:'0000-00-00 00:00:00'
MySQL 版本为 5.7.18。
对此的任何想法都会有很大帮助。
要允许零日期 (0000-00-00 00:00:00),您需要删除该限制。
要删除特定的 SQL 模式(在本例中为NO_ZERO_DATE),请找到当前的 SQL 模式:
SELECT @@GLOBAL.sql_mode;
Run Code Online (Sandbox Code Playgroud)
复制结果并从中删除您不需要的内容(NO_ZERO_DATE)
例如:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)
到
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)
创建并打开此文件:
sudo vim /etc/mysql/conf.d/disable_strict_mode.cnf
Run Code Online (Sandbox Code Playgroud)
并将您的新 SQL 模式写入并粘贴到其中:
[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)
重启 MySQL:
sudo service mysql restart
Run Code Online (Sandbox Code Playgroud)
小智 -1
不言而喻,你做错了。如果您打算不存储任何内容,则该列应该可以为空,并且当您应该使用 NULL 时,不应尝试插入空字符串。
不过,请考虑一下:
如果严格模式未生效,MySQL 会插入无效或缺失值的调整值并产生警告。但是当严格模式生效时......
对于事务表,当启用 STRICT_ALL_TABLES 或 STRICT_TRANS_TABLES 时,数据更改语句中的值无效或缺失会出现错误。该语句被中止并回滚
http://dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sql-mode-strict 选择@@SQL_MODE; 应该显示您正在使用(至少)STRICT_TRANS_TABLES 运行。虽然这不是 5.6 中的内部默认设置,但它包含在默认的 5.6 配置文件中。如果您想要旧的行为,您需要删除它并重新启动服务器。
...尽管您应该考虑使您的代码表现得更正确。
尝试启用此功能
ALLOW_INVALID_DATES
http://dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sqlmode_allow_invalid_dates
注意:我不建议这样做。我只是回答如何做。在我看来,最好清理查询和数据,并为非空列提供良好的默认值。