mysql查询数据库报错sql_mode_MySQL数据库的sql_mode
內(nèi)容綱要
錯(cuò)誤詳情
插入或?qū)霐?shù)據(jù)庫時(shí),如果時(shí)間字段的格式為 ‘0’ ,插入時(shí)報(bào)錯(cuò):
ERROR 1292 (22007): Incorrect datetime value: '0' for column 'xxx' at row 1
使用GROUP BY語句報(bào)錯(cuò)
MySQL [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause
原因
以上錯(cuò)誤都是由于sql_mode設(shè)置了嚴(yán)格模式,所以插入失敗。
sql_mode簡而言之就是:它定義了你MySQL應(yīng)該支持的sql語法,對(duì)數(shù)據(jù)的校驗(yàn)等等。
在生產(chǎn)環(huán)境中強(qiáng)烈建議將這個(gè)值設(shè)置為嚴(yán)格模式,這樣有些問題可以在數(shù)據(jù)庫的設(shè)計(jì)和開發(fā)階段就能實(shí)現(xiàn),而如果在生產(chǎn)環(huán)境下運(yùn)行數(shù)據(jù)庫后發(fā)現(xiàn)這類問題,那么修改的代價(jià)將變得十分巨大。此外正確地設(shè)置sql_mode還可以做一些約束(constraint)檢查的工作。
5.6和5.7的默認(rèn)設(shè)置
# MySQL 5.6 Default SQL_MODE;
mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)
# MySQL 5.7 Default SQL_MODE;
mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@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,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
sql_mode設(shè)置
命令行&SQL
set sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
my.cnf
# 在my.cnf添加如下配置
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
sql_mode常用值
ONLY_FULL_GROUP_BY
對(duì)于GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現(xiàn),那么這個(gè)SQL是不合法的,因?yàn)榱胁辉贕ROUP BY從句中。
在嚴(yán)格模式下,不要讓GROUP BY部分中的查詢指向未選擇的列,否則報(bào)錯(cuò)。
NO_AUTO_VALUE_ON_ZERO
該值影響自增長列的插入。默認(rèn)設(shè)置下,插入0或NULL代表生成下一個(gè)自增長值。如果用戶 希望插入的值為0,而該列又是自增長的,那么這個(gè)選項(xiàng)就有用了。
STRICT_TRANS_TABLES
在該模式下,如果一個(gè)值不能插入到一個(gè)事務(wù)表中,則中斷當(dāng)前的操作,對(duì)非事務(wù)表不做限制
NO_ZERO_IN_DATE
在嚴(yán)格模式下,不允許日期和月份為’0′
NO_ZERO_DATE
設(shè)置該值,mysql數(shù)據(jù)庫不允許插入’0000-00-00 00:00:00’,插入零日期會(huì)拋出錯(cuò)誤而不是警告
ERROR_FOR_DIVISION_BY_ZERO
在INSERT或UPDATE過程中,如果數(shù)據(jù)被零除,則產(chǎn)生錯(cuò)誤而非警告。如 果未給出該模式,那么數(shù)據(jù)被零除時(shí)MySQL返回NULL
NO_AUTO_CREATE_USER
禁止GRANT創(chuàng)建密碼為空的用戶
NO_ENGINE_SUBSTITUTION
如果需要的存儲(chǔ)引擎被禁用或未編譯,那么拋出錯(cuò)誤。不設(shè)置此值時(shí),用默認(rèn)的存儲(chǔ)引擎替代,并拋出一個(gè)異常
PIPES_AS_CONCAT
將"||"視為字符串的連接操作符而非或運(yùn)算符,這和Oracle數(shù)據(jù)庫是一樣的,也和字符串的拼接函數(shù)Concat相類似
ANSI_QUOTES
啟用ANSI_QUOTES后,不能用雙引號(hào)來引用字符串,因?yàn)樗唤忉尀樽R(shí)別符
總結(jié)
以上是生活随笔為你收集整理的mysql查询数据库报错sql_mode_MySQL数据库的sql_mode的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux操作系统下双网卡路由表配置
- 下一篇: mysql rpm安装报错_Mysql