亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL默認(rèn)sql_mode淺析

 更新時(shí)間:2023年03月29日 09:50:05   作者:劉牌  
這篇文章主要為大家介紹了MySQL默認(rèn)sql_mode淺析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

SQL mode

今天我們來(lái)分享一下MySQL的SQL mode , 這也是我們比較容易忽略的一點(diǎn),我們?cè)谝婚_(kāi)始安裝數(shù)據(jù)庫(kù)的時(shí)候其實(shí)就要先考慮要保留哪些SQL mode,去除哪些,合理的配置能夠減少很多不必要的麻煩。

MySQL 5.7默認(rèn)的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。

這是MySQL官網(wǎng)的原文描述:“These modes were added to the default SQL mode in MySQL 5.7: The ONLY_FULL_GROUP_BY and STRICT_TRANS_TABLES modes were added in MySQL 5.7.5. The NO_AUTO_CREATE_USER mode was added in MySQL 5.7.7. The ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE, and NO_ZERO_IN_DATE modes were added in MySQL 5.7.8. For additional discussion regarding these changes to the default SQL mode value, see SQL Mode Changes in MySQL 5.7.”

show sql mode

SELECT @@GLOBAL.sql_mode;

SELECT @@SESSION.sql_mode;

set sql mode

設(shè)置為GLOBAL,那么所有的客戶(hù)端都會(huì)受到影響,不過(guò)要擁有SUPER權(quán)限才能進(jìn)行設(shè)置,也就是root用戶(hù),設(shè)置SESSION,那么受影響的只是當(dāng)前的連接會(huì)話。

SET GLOBAL sql_mode ='ONLY_FULL_GROUP_BY'

SET SESSION sql_mode ='ONLY_FULL_GROUP_BY'

下面我們就針對(duì)默認(rèn)設(shè)置的這幾種SQL mode進(jìn)行詳細(xì)的講解,其他的哪些大家可以去官網(wǎng)參考。

docs.oracle.com/cd/E17952_0…

默認(rèn)的SQL mode

ONLY_FULL_GROUP_BY

設(shè)置了這個(gè)值,如果使用GROUP BY,在SELECT后面出現(xiàn)的字段,在GROUP BY后面必須出現(xiàn),不然報(bào)錯(cuò)如下

Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'blue.shop.price' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

如下使用的是MySQL默認(rèn)的sql_mode

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

那么下面的語(yǔ)句就會(huì)報(bào)錯(cuò),因?yàn)镚ROUP BY后面只有一個(gè)字段,而SELECT * 是查出所有字段,所以就報(bào)錯(cuò)。

SELECT * FROM shop GROUP BY article 

這樣寫(xiě)就不會(huì)報(bào)錯(cuò)

SELECT * FROM shop GROUP BY article , dealer , price

不過(guò)我們不可能使用一個(gè)GROUP BY,后面還要跟著所有字段,顯然不合理,那么就應(yīng)該將其關(guān)閉,只需要將其去掉就行

STRICT_TRANS_TABLES

嚴(yán)格模式控制MySQL如何處理數(shù)據(jù)更改語(yǔ)句中的無(wú)效或缺失值,如INSERT或UPDATE。一個(gè)值可能因多種原因無(wú)效。例如,它可能具有列的錯(cuò)誤數(shù)據(jù)類(lèi)型,或者它可能超出了范圍。如果要插入的新行不包含定義中沒(méi)有顯式DEFAULT子句的非null列的值,則該值缺失。

比如我們的某個(gè)字段設(shè)置不能為NULL,而我們插入的數(shù)據(jù)這個(gè)字段為NULL,那么就不能通過(guò),就會(huì)報(bào)錯(cuò)如下:

1364 - Field 'dealer' doesn't have a default value

那么這個(gè)問(wèn)題要怎么解決呢?我相信這個(gè)問(wèn)題大家經(jīng)常遇到,一般是我們?cè)诓迦霐?shù)據(jù)的時(shí)候?qū)嶓w的屬性沒(méi)有賦值,所以導(dǎo)致這個(gè)問(wèn)題,所以我們會(huì)去檢查代碼,然后給屬性賦值,另外一種做法就是去除STRICT_TRANS_TABLES,這樣就不會(huì)進(jìn)行校驗(yàn),不過(guò)是極其不推薦這樣做的,因?yàn)橐覀円WC數(shù)據(jù)的完整性,所以必須在代碼層面做好工作。

NO_ZERO_IN_DATE

NO_ZERO_IN_DATE模式會(huì)影響服務(wù)器是否允許年部分不為零但月或日部分為0的日期。(該模式影響日期,如“2010-00-01”或“2010-01-00”,但不影響“0000-00-00”。要控制服務(wù)器是否允許'0000-00-00',請(qǐng)使用NO_ZERO_DATE模式。)NO_ZERO_IN_DATE的效果還取決于是否啟用嚴(yán)格SQL模式,如果沒(méi)有啟用嚴(yán)格SQL模式STRICT_TRANS_TABLES,那么啟用了NO_ZERO_IN_DATE也沒(méi)用。

如下SQL的日期月和日為0,啟用了嚴(yán)格模式STRICT_TRANS_TABLES和NO_ZERO_IN_DATE,那么就會(huì)報(bào)錯(cuò)。

INSERT INTO `blue`.`shop` (`article`, `dealer` ,`price`,`date`) VALUES ('商品5', '5', 5.00, '2022-00-00');

1292 - Incorrect datetime value: '2022-00-00' for column 'date' at row 1

去除嚴(yán)格模式STRICT_TRANS_TABLESNO_ZERO_IN_DATE就不會(huì)報(bào)錯(cuò)。

NO_ZERO_DATE

上面的NO_ZERO_IN_DATE可以插入'0000-00-00',如果使用了嚴(yán)格模式STRICT_TRANS_TABLES和NO_ZERO_DATE,那么就不可以插入'0000-00-00'。

ERROR_FOR_DIVISION_BY_ZERO

對(duì)于INSERT或者UPDATE中,如果被除數(shù)為0,那么就會(huì)產(chǎn)生錯(cuò)誤,數(shù)據(jù)無(wú)法插入,MOD(N,M)也是一樣

INSERT INTO `blue`.`shop` (`article`,dealer ,`price`,`date`) VALUES ('商品5', '5', MOD(10,0), '0000-00-00');

對(duì)于SELECT,如果被除數(shù)為0,那么就會(huì)返回NULL,MOD(N,M)也一樣。

SELECT price / 0  FROM shop

報(bào)錯(cuò)信息: 1365 - Division by 0

NO_AUTO_CREATE_USER

不能使用grant命令創(chuàng)建密碼為空的用戶(hù)。

NO_ENGINE_SUBSTITUTION

如果指定了NO_ENGINE_SUBSTITUTION,我們?cè)趧?chuàng)建表或者修改表的時(shí)候,如果去指定了不存在或者不支持的存儲(chǔ)引擎,那么就會(huì)報(bào)錯(cuò),無(wú)法創(chuàng)建和修改,如果沒(méi)有配置NO_ENGINE_SUBSTITUTION,那么就會(huì)將我們指定的存儲(chǔ)引擎(不支持或者不存在)的存儲(chǔ)引擎替換為默認(rèn)的存儲(chǔ)引擎,MySQL5.7后的默認(rèn)存儲(chǔ)引擎為InnoDB,所以就會(huì)自動(dòng)設(shè)置為InnoDB。

如下我們創(chuàng)建表,將存儲(chǔ)引擎設(shè)置為一個(gè)不存在的InnoDBTest,因?yàn)槲覀內(nèi)コ薔O_ENGINE_SUBSTITUTION,所以不會(huì)報(bào)錯(cuò),并且會(huì)替換成默認(rèn)的InnoDB

創(chuàng)建sql

CREATE TABLE store ( `name` VARCHAR ( 255 ) DEFAULT NULL ) ENGINE = InnoDBTest

查看創(chuàng)建過(guò)程

SHOW CREATE TABLE store

結(jié)果

CREATE TABLE `store` (
  `name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

MySQL存儲(chǔ)引擎

SHOW ENGINES;

關(guān)于MySQL的SQL mode,就說(shuō)到這里,我只列舉了MySQL5.7默認(rèn)的幾種并對(duì)其進(jìn)行講解,有興趣的話可以去了解其他的選項(xiàng)

以上就是MySQL默認(rèn)sql_mode淺析的詳細(xì)內(nèi)容,更多關(guān)于MySQL默認(rèn)sql_mode的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MySQL存儲(chǔ)過(guò)程的權(quán)限問(wèn)題小結(jié)

    MySQL存儲(chǔ)過(guò)程的權(quán)限問(wèn)題小結(jié)

    這篇文章主要介紹了MySQL存儲(chǔ)過(guò)程的權(quán)限問(wèn)題小結(jié)及mysql 創(chuàng)建存儲(chǔ)過(guò)程權(quán)限問(wèn)題,感興趣的朋友一起看看吧
    2018-04-04
  • mysql8.0主從復(fù)制搭建與配置方案

    mysql8.0主從復(fù)制搭建與配置方案

    MySQL主從復(fù)制是一個(gè)異步的復(fù)制過(guò)程,就是有兩個(gè)數(shù)據(jù)庫(kù)服務(wù)器,一個(gè)是主(master)數(shù)據(jù)庫(kù)服務(wù)器,另一個(gè)是從(slave)數(shù)據(jù)庫(kù)服務(wù)器。
    2022-09-09
  • Mysql添加、刪除、主鍵(外鍵)方法詳細(xì)講解

    Mysql添加、刪除、主鍵(外鍵)方法詳細(xì)講解

    MySQL是一種廣泛使用的開(kāi)源關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),在數(shù)據(jù)庫(kù)設(shè)計(jì)中主鍵和外鍵是兩個(gè)重要的概念,下面這篇文章主要給大家介紹了關(guān)于Mysql添加、刪除、主鍵(外鍵)方法的相關(guān)資料,需要的朋友可以參考下
    2024-06-06
  • MySQL對(duì)數(shù)據(jù)庫(kù)和表進(jìn)行DDL命令的操作代碼

    MySQL對(duì)數(shù)據(jù)庫(kù)和表進(jìn)行DDL命令的操作代碼

    DDL(Data?Definition?Language),是數(shù)據(jù)定義語(yǔ)言的縮寫(xiě),它是SQL(Structured?Query?Language)語(yǔ)言的一個(gè)子集,用于定義或修改數(shù)據(jù)庫(kù)的結(jié)構(gòu),本文給大家介紹了MySQL對(duì)數(shù)據(jù)庫(kù)和表進(jìn)行DDL命令的操作,需要的朋友可以參考下
    2024-07-07
  • MySQL之解決字符串?dāng)?shù)字的排序失效問(wèn)題

    MySQL之解決字符串?dāng)?shù)字的排序失效問(wèn)題

    這篇文章主要介紹了MySQL之解決字符串?dāng)?shù)字的排序失效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 教你用eclipse連接mysql數(shù)據(jù)庫(kù)

    教你用eclipse連接mysql數(shù)據(jù)庫(kù)

    這篇文章主要介紹了教你用eclipse連接mysql數(shù)據(jù)庫(kù),文中有非常詳細(xì)的圖文示例,對(duì)不會(huì)鏈接mysql的小伙伴們有很大的幫助,需要的朋友可以參考下
    2021-04-04
  • 解決MySQL讀寫(xiě)分離導(dǎo)致insert后select不到數(shù)據(jù)的問(wèn)題

    解決MySQL讀寫(xiě)分離導(dǎo)致insert后select不到數(shù)據(jù)的問(wèn)題

    這篇文章主要介紹了解決MySQL讀寫(xiě)分離導(dǎo)致insert后select不到數(shù)據(jù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 一文詳解SQL?中的三值邏輯

    一文詳解SQL?中的三值邏輯

    這篇文章主要介紹了一文詳解SQL中的三值邏輯,文章圍繞主題展開(kāi)對(duì)三值邏輯Null的詳細(xì)介紹,感興趣的小伙伴可以參考一下
    2022-09-09
  • MySQL root密碼的重置方法

    MySQL root密碼的重置方法

    這篇文章主要介紹了MySQL root密碼的重置方法,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-04-04
  • MySQL中查看數(shù)據(jù)庫(kù)安裝路徑的方法

    MySQL中查看數(shù)據(jù)庫(kù)安裝路徑的方法

    有時(shí)候在我們開(kāi)發(fā)的過(guò)程中并不一定記得數(shù)據(jù)庫(kù)的安裝路徑,比如要查看mysql 數(shù)據(jù)庫(kù)的安裝目錄在哪里,這里就為大家分享一下
    2021-03-03

最新評(píng)論