mysql java safe model_被 MySQL sql_mode 深深伤害( 下 )
當(dāng)我們要重新設(shè)置 MySQL sql_mode 的時(shí)候,可能看到那一串長(zhǎng)長(zhǎng)的列表就會(huì)患頭痛病,這哪個(gè)是哪個(gè)啊,哪個(gè)是重要的啊?哪個(gè)是可以缺少的啊?
我們就會(huì)想要呼喚一個(gè)簡(jiǎn)單的版本,要是有三個(gè)特殊的 sql_mode 分別表示寬松、標(biāo)準(zhǔn)、嚴(yán)格那該多好,出現(xiàn) sql_mode 問題的時(shí)候就先設(shè)置寬松版本
MySQL 也考慮到了這個(gè)問題,所以在 5.0 以后的版本中新增加了三個(gè)特殊的 sql_mode
sql_mode
說明
ANSI
寬松模式,對(duì)于大部分的 sql 語句按照古老的模式執(zhí)行成功,但會(huì)拋出一個(gè)警告
TRADITIONAL
算是標(biāo)準(zhǔn)模式吧,這種模式下有些?sql?語句就會(huì)直接出錯(cuò)
STRICT_TRANS_TABLES
嚴(yán)格模式,這種模式下只要一條 SQL 語句出錯(cuò)就會(huì)直接中斷事務(wù)的執(zhí)行
而設(shè)置這三種模式的語法也很簡(jiǎn)單
設(shè)置當(dāng)前連接的 sql_mode
set @@sql_mode=TRADITIONAL;
set @@sql_mode=STRICT_TRANS_TABLES;
set @@sql_mode=ANSI;
設(shè)置全局的 sql_mode
set global @@sql_mode=TRADITIONAL;
set global @@sql_mode=STRICT_TRANS_TABLES;
set global @@sql_mode=ANSI;
持久化設(shè)置,也就是更改 my.cnf 文件
[mysqlnd]
sql_mode=TRADITIONAL
sql_mode=STRICT_TRANS_TABLES
sql_mode=ANSI
對(duì)了,三者你只能選擇一個(gè)
對(duì)于我們前面提到的?timestamp?默認(rèn)值?0?錯(cuò)誤等,可以直接使用?ANSI?模式,這樣便可以插入數(shù)據(jù),而對(duì)于除數(shù)為0的結(jié)果的字段值,數(shù)據(jù)庫將會(huì)用?NULL?值代替
剛剛我們不是說了這三種特殊的模式是一些其它模式的結(jié)合體嗎?我們下面就來看看它們包括哪些具體的 sql_mode
ANSI
相當(dāng)于
REAL_AS_FLOAT
PIPES_AS_CONCAT
ANSI_QUOTES
IGNORE_SPACE
ONLY_FULL_GROUP_BY
注意,還是包含了?ONLY_FULL_GROUP_BY
STRICT_TRANS_TABLES
它不是一個(gè)結(jié)合體,而是一個(gè)單獨(dú)體,在這個(gè)模式下,會(huì)進(jìn)行數(shù)據(jù)的嚴(yán)格校驗(yàn),錯(cuò)誤數(shù)據(jù)不能插入,報(bào) error 錯(cuò)誤
如果不能將給定的值插入到事務(wù)表中,則放棄該語句
對(duì)于非事務(wù)表,如果值出現(xiàn)在單行語句或多行語句的第1行,則放棄該語句
TRADITIONAL
相當(dāng)于
STRICT_TRANS_TABLES
STRICT_ALL_TABLES
NO_ZERO_IN_DATE
NO_ZERO_DATE
ERROR_FOR_DIVISION_BY_ZERO
NO_ENGINE_SUBSTITUTION
注意,包含了?STRICT_TRANS_TABLES
時(shí)間有限,這一章節(jié)我們先講到這里,我覺得 sql_mode 還是看官方的文檔來的最好
總結(jié)
以上是生活随笔為你收集整理的mysql java safe model_被 MySQL sql_mode 深深伤害( 下 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux挂载新加硬盘
- 下一篇: 面试滑铁卢之:说说关系型数据库的特点