现象:MySQL5.7版本以后,date, datetime类型设置默认值"0000-00-00",出现异常:Invalid default value for 'time'mysql
缘由:在命令行窗口查看当前的sql_mode配置:sql
select @@sql_mode;
数据库
结果以下: ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and NO_ENGINE_SUBSTITUTION
其中NO_ZERO_IN_DATE, NO_ZERO_DATE两个选项禁止了0000这样的日期和时间。所以在mysql的配置文件中,从新设置sql_mode,去掉这两项就能够了。windows
windows系统下:oracle
使用 SET [SESSION|GLOBAL] sql_mode=’modes’ 注意:SESSION(默认选项):表示当前回话中生效;GLOBAL(需重启):表示全局生效
也能够修改my.ini配置文件函数
*** 演示: SET GLOBAL sql_mode=’ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES, ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’
Linux系统下:命令行
修改my.cnf文件,在[mysqld]中添加code
sql-mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
修改完成必定重启MySQL事务
Mac系统下:ci
在MacOS中默认是没有my.cnf 文件,若是须要对MySql 进行定制,拷贝/usr/local/mysql/support-files/目录 中任意一个.cnf 文件。笔者拷贝的是my-default.cnf,将它放到其余目录,按照上面修改完毕以后,改名为 my.cnf,而后拷贝到/etc目录再重启下mysql就大功告成了。
ONLY_FULL_GROUP_BY
对于GROUP BY聚合操做,若是在SELECT中的列、HAVING或者ORDER BY子句的列,没有在GROUP BY中出现,那么这个SQL是不合法的。是能够理解的,由于不在 group by 的列查出来展现会有矛盾。 在5.7中默认启用,因此在实施5.6升级到5.7的过程须要注意:
ANSI_QUOTES
启用 ANSI_QUOTES 后,不能用双引号来引用字符串,由于它被解释为识别符,做用与 ` 同样。
设置它之后,update t set f1="" ...,会报 Unknown column ‘’ in ‘field list 这样的语法错误。
PIPES_AS_CONCAT
将 || 视为字符串的链接操做符而非运算符,这和Oracle数据库是同样的,也和字符串的拼接函数 CONCAT() 相相似
NO_TABLE_OPTIONS
使用 SHOW CREATE TABLE 时不会输出mysql特有的语法部分,如 ENGINE ,这个在使用 mysqldump 跨DB种类迁移的时候须要考虑
NO_AUTO_CREATE_USER
字面意思不自动建立用户。在给MySQL用户受权时,咱们习惯使用 GRANT ... ON ... TO dbuser顺道一块儿建立用户。设置该选项后就与oracle操做相似,受权以前必须先创建用户。5.7.7开始也默认了。
mysql5.0以上版本支持三种sql_mode模式: set @@sql_mode=xxx模式名;
咱们常设置的 sql_mode 是 ANSI、STRICT_TRANS_TABLES、TRADITIONAL,其中ANSI和TRADITIONAL是上面的几种组合。
ANSI模式:宽松模式,对插入数据进行校验,若是不符合定义类型或者长度,对数据类型调整或截断保存,报warning警告.
TRADITIONAL模式:严格模式,当向MySQL数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误.用于事务时,会进行事务的回滚.
3.STRICT_TRANS_TABLES模式:严格模式,进行数据的严格校验,错误数据不能插入,报error错误。