详解Mysql数据库date, datetime类型设置0000-00-00默认值
详解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模式
编程语言
- 详解Mysql数据库date, datetime类型设置0000-00-00默认值
- ASP.NET中常用输出JS脚本的类实例
- JS遍历JSON数组及获取JSON数组长度操作示例【测试
- JS编写函数实现对身份证号码最后一位的验证功能
- SQL Server 2016 CTP2.2安装配置方法图文教程
- Yii结合CKEditor实现图片上传功能
- Laravel框架学习笔记(二)项目实战之模型(Mod
- 深入浅析安装PhpStorm并激活的步骤详解
- PHP用PDO如何封装简单易用的DB类详解
- 微信小程序 本地数据读取实例
- win10下安装两个MySQL5.6.35数据库
- linux下使用RPM安装mysql5.7.17
- 基于daterangepicker日历插件使用参数注意的问题
- 基于EasyUI的基础之上实现树形功能菜单
- 基于Bootstrap3表格插件和分页插件实例详解
- 气象 XML 数据源应用程序开发指南-简介