Mysql中sql_mode使用詳解
1 sql_mode簡(jiǎn)介
sql_mode是一組mysql的語(yǔ)法校驗(yàn)規(guī)則,定義了mysql應(yīng)該支持的sql語(yǔ)法、數(shù)據(jù)校驗(yàn)等。
1.1 查看當(dāng)前的sql_mode
查看當(dāng)前的sql_mode,三種方式:
(1)select @@sql_mode;
(2)select @@SESSION.sql_mode;
(3)select @@GLOBAL.sql_mode;
輸出如下:
STRICT_TRANS_TABLES,
NO_ZERO_IN_DATE,
NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,
NO_ENGINE_SUBSTITUTION
1.2 如何設(shè)置sql_mode
方式一:通過(guò)命令設(shè)置
SET sql_mode = '';
SET SESSION sql_mode = '';
SET GLOBAL sql_mode = '';
方式二:修改mysql的配置文件my.cnf
修改后需要重啟mysql服務(wù)使其生效
[mysqld]
sql_mode = ANSI
1.3 sql_mode模式
1.3.1 ANSI模式
這是一種寬松模式,該模式下,會(huì)對(duì)所操作數(shù)據(jù)進(jìn)行校驗(yàn),如果不符合校驗(yàn)規(guī)則,數(shù)據(jù)會(huì)按照規(guī)則執(zhí)行,并報(bào)warning警告。
該模式下,sql_mode參數(shù)為:
REAL_AS_FLOAT,
PIPES_AS_CONCAT,
ANSI_QUOTES,
IGNORE_SPACE,
ANSI
1.3.2 STRICT_TRANS_TABLES模式
這是一種嚴(yán)格模式,該模式下,會(huì)對(duì)所操作數(shù)據(jù)進(jìn)行嚴(yán)格校驗(yàn),如果不符合校驗(yàn)規(guī)則,報(bào)error錯(cuò)誤。
該模式下,sql_mode參數(shù)為:
STRICT_TRANS_TABLES
1.3.3 TRADITIONAL模式
這是一種嚴(yán)格模式,該模式下,會(huì)對(duì)所操作數(shù)據(jù)進(jìn)行嚴(yán)格校驗(yàn),如果不符合校驗(yàn)規(guī)則,報(bào)error錯(cuò)誤。用于事務(wù)時(shí),會(huì)進(jìn)行事物的回滾,保證了錯(cuò)誤數(shù)據(jù)無(wú)法插入到數(shù)據(jù)庫(kù)中。
該模式下,sql_mode參數(shù)為:
STRICT_TRANS_TABLES,
STRICT_ALL_TABLES,
NO_ZERO_IN_DATE,
NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,
TRADITIONAL,
NO_AUTO_CREATE_USER,
NO_ENGINE_SUBSTITUTION
1.4 常用sql_mode各參數(shù)詳解
1、PIPES_AS_CONCAT
將"||"作為字符串的鏈接字符操作,而不是作為或運(yùn)算符,
與"concat"相類(lèi)似。
2、ANSI_QUOTES
不能用雙引號(hào)來(lái)引用字符串,因?yàn)樗鼤?huì)被解釋為識(shí)別符。
3、IGNORE_SPACE
用于忽略mysql系統(tǒng)函數(shù)與之后的括號(hào)之間的空格。
4、STRICT_TRANS_TABLES和STRICT_ALL_TABLES
嚴(yán)格模式的一種,會(huì)對(duì)所操作數(shù)據(jù)進(jìn)行嚴(yán)格校驗(yàn)。
如果不符合校驗(yàn)規(guī)則,報(bào)error錯(cuò)誤。
5、NO_ZERO_IN_DATE
在嚴(yán)格模式下,不允許日期和月份為零。
6、NO_ZERO_DATE
在嚴(yán)格模式下,不允許插入0日期。
7、ERROR_FOR_DIVISION_BY_ZERO
在嚴(yán)格模式下,不允許在字段中插入除數(shù)為0的運(yùn)算值,會(huì)直接報(bào)錯(cuò)。
直接計(jì)算除數(shù)為0的運(yùn)算,返回null,報(bào)warning。
8、ONLY_FULL_GROUP_BY
select后面的字段中,只能出現(xiàn)分組列和聚合列。
9、其他
NO_AUTO_CREATE_USER(用戶)
ALLOW_INVALID_DATES(日期)
HIGH_NOT_PRECEDENCE(not優(yōu)先級(jí))
NO_AUTO_VALUE_ON_ZERO(主鍵)
NO_BACKSLASH_ESCAPES(反斜杠)
NO_DIR_IN_CREATE(數(shù)據(jù)目錄)
NO_ENGINE_SUBSTITUTION(存儲(chǔ)引擎)
NO_UNSIGNED_SUBTRACTION(無(wú)符號(hào)數(shù)相減計(jì)算)
PAD_CHAR_TO_FULL_LENGTH(char字段存儲(chǔ))
TIME_TRUNCATE_FRACTIONAL(時(shí)間類(lèi)型超出范圍處理)
1.5 不同版本默認(rèn)的sql_mode
MySQL 5.5:空
MySQL 5.6:NO_ENGINE_SUBSTITUTION【存儲(chǔ)引擎】
MySQL 5.7:
ONLY_FULL_GROUP_BY,【select后面的字段中,只能出現(xiàn)分組列和聚合列】
STRICT_TRANS_TABLES,【嚴(yán)格模式的一種,會(huì)對(duì)所操作數(shù)據(jù)進(jìn)行嚴(yán)格校驗(yàn)】
NO_ZERO_IN_DATE, 【在嚴(yán)格模式下,不允許日期和月份為零】
NO_ZERO_DATE, 【在嚴(yán)格模式下,不允許插入0日期】
ERROR_FOR_DIVISION_BY_ZERO, 【在嚴(yán)格模式下,不允許在字段中插入除數(shù)為0的運(yùn)算值,會(huì)直接報(bào)錯(cuò)】
NO_AUTO_CREATE_USER, 【用戶】
NO_ENGINE_SUBSTITUTION【存儲(chǔ)引擎】
MySQL 8.0:
ONLY_FULL_GROUP_BY, 【select后面的字段中,只能出現(xiàn)分組列和聚合列】
STRICT_TRANS_TABLES, 【嚴(yán)格模式的一種,會(huì)對(duì)所操作數(shù)據(jù)進(jìn)行嚴(yán)格校驗(yàn)】
NO_ZERO_IN_DATE, 【在嚴(yán)格模式下,不允許日期和月份為零】
NO_ZERO_DATE, 【在嚴(yán)格模式下,不允許插入0日期】
ERROR_FOR_DIVISION_BY_ZERO, 【在嚴(yán)格模式下,不允許在字段中插入除數(shù)為0的運(yùn)算值,會(huì)直接報(bào)錯(cuò)】
NO_ENGINE_SUBSTITUTION【存儲(chǔ)引擎】
2 實(shí)際應(yīng)用
1.查詢當(dāng)前 mysql 數(shù)據(jù)庫(kù) 的 SQL_MODE
select @@SQL_MODE
如果包含 ANSI_QUOTES
2.修改my.cnf
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
保存配置文件,之后重啟mysql 服務(wù)
3.然后再次驗(yàn)證
select @@SQL_MODE文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-433708.html
SQL驗(yàn)證
select REPLACE(uuid(),“-”,“”) from DUAL文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-433708.html
到了這里,關(guān)于關(guān)系數(shù)據(jù)庫(kù)-9-[mysql8]中的語(yǔ)法校驗(yàn)規(guī)則sql_mode應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!