详解Mysql数据库date, datetime类型设置0000-00-00默认值

网络编程 2025-03-29 19:57www.168986.cn编程入门

详解MySQL数据库中的date和datetime类型设置默认值问题及解决方案

自长沙网络推广分享的一个现象引起了广泛关注:在MySQL 5.7版本之后,为date和datetime类型设置默认值为"0000-00-00"时会出现报错。今天,让我们一起跟随长沙网络推广的脚步,深入这个问题并找到解决方案。

现象描述:在MySQL 5.7版本之后,如果你尝试为date和datetime类型的字段设置默认值为"0000-00-00",你会遇到一个错误提示:“Invalid default value for 'time'”。

原因:出现这个问题的原因在于MySQL的sql_mode配置中的两个选项:NO_ZERO_IN_DATE和NO_ZERO_DATE。这两个选项禁止了像"0000-00-00"这样的日期和时间。要解决这个问题,我们需要修改MySQL的sql_mode配置,移除这两个选项。

解决方案:

1. Windows系统下:

使用SET [SESSION|GLOBAL] sql_mode='modes'命令来修改sql_mode的配置。其中,SESSION表示修改在当前会话中生效,GLOBAL表示修改全局生效。你也可以选择修改myi配置文件。例如,使用命令SET GLOBAL sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES, ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'。

2. Linux系统下:

修改myf文件,在[mysqld]部分添加sql-mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION。修改完成后,一定要重启MySQL服务。

3. Mac系统下:

在MacOS中默认没有myf文件。如果需要对MySQL进行定制,可以拷贝/usr/local/mysql/support-files/目录中的任意一个.f文件。比如拷贝my-default.f文件到其他目录,按照上面修改完毕之后,更名为myf,然后拷贝到/etc目录,并重启MySQL服务。

sql_mode常用值说明:

ONLY_FULL_GROUP_BY:对于GROUP BY聚合操作,如果在SELECT中的列、HAVING或者ORDER BY子句的列没有在GROUP BY中出现,那么这个SQL是不合法的。这个选项在MySQL 5.7中默认启用。

ANSI_QUOTES:启用该选项后,不能使用双引号来引用字符串,因为它被视为识别符。

PIPES_AS_CONCAT:将||视为字符串的连接操作符而非运算符。这与Oracle数据库的行为相似。

NO_TABLE_OPTIONS:在使用SHOW CREATE TABLE时不会输出MySQL特有的语法部分,如ENGINE。这在mysqldump跨数据库迁移时需要考虑。

MySQL授权小课堂:深入了解GRANT与dbuser的创建

当我们谈及MySQL用户授权时,GRANT语句和dbuser的创建总是如影随形。从MySQL 5.7.7版本开始,默认设置就要求我们如同操作Oracle那样,在授权之前必须先建立用户。这背后有着深厚的逻辑考虑和实际操作需要。让我们深入其中的细节。

关于数据检查的那些事儿

在MySQL中,对于数据的校验是非常严谨的。当我们谈及NO_ZERO_DATE这个选项时,其实是在讨论日期‘0000-00-00’的合法性。这个日期的合法性取决于是否设置了严格模式。在严格模式下,NO_ZERO_DATE自然是生效的,但如果使用了INSERT IGNORE或UPDATE IGNORE语句,那么这个日期仍然会被允许,但系统会发出警告。在非严格模式下,无论是否设置了NO_ZERO_DATE,这个日期都会被允许并发出警告;如果没有设置NO_ZERO_DATE,系统将视该日期为完全合法。与NO_ZERO_DATE类似,NO_ZERO_IN_DATE也是控制日期和天是否可以为0的选项,例如判断2010-01-00是否合法。这些细节都反映了MySQL对于数据完整性的高度重视。

再来说说NO_ENGINE_SUBSTITUTION。当我们使用ALTER TABLE或CREATE TABLE语句指定ENGINE时,如果所需的存储引擎被禁用或未编译,处理方式就取决于是否启用了NO_ENGINE_SUBSTITUTION。启用此选项时,系统会直接抛出错误;如果不启用,CREATE语句会使用默认的存储引擎进行替代,而ALTER TABLE则不会进行更改并发出警告。

深入了解STRICT_TRANS_TABLES模式

上一篇:ASP.NET中常用输出JS脚本的类实例 下一篇:没有了

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by