<strike id="5ntnv"><i id="5ntnv"><del id="5ntnv"></del></i></strike>
<strike id="5ntnv"></strike><ruby id="5ntnv"></ruby><del id="5ntnv"><dl id="5ntnv"><del id="5ntnv"></del></dl></del><strike id="5ntnv"><dl id="5ntnv"><del id="5ntnv"></del></dl></strike>
<strike id="5ntnv"></strike>
<strike id="5ntnv"></strike>
<span id="5ntnv"><dl id="5ntnv"></dl></span>
<strike id="5ntnv"><i id="5ntnv"><del id="5ntnv"></del></i></strike><th id="5ntnv"><noframes id="5ntnv"><span id="5ntnv"><dl id="5ntnv"><del id="5ntnv"></del></dl></span>
<span id="5ntnv"></span>
<strike id="5ntnv"><dl id="5ntnv"><del id="5ntnv"></del></dl></strike>
<strike id="5ntnv"><dl id="5ntnv"><del id="5ntnv"></del></dl></strike><strike id="5ntnv"><i id="5ntnv"></i></strike><span id="5ntnv"></span>
<strike id="5ntnv"></strike>
<strike id="5ntnv"></strike>
<th id="5ntnv"><noframes id="5ntnv">
<ruby id="5ntnv"></ruby>
<strike id="5ntnv"><dl id="5ntnv"></dl></strike>

貴州網站建設公司貴州網站建設公司

淺談MySQL的sql

SQL mode

今天我們來分享一下MySQL的淺談SQL mode , 這也是我們比較容易忽略的一點,我們在一開始安裝數據庫的淺談時候其實就要先考慮要保留哪些SQL mode,去除哪些,淺談合理的淺談配置能夠減少很多不必要的麻煩。

淺談MySQL的淺談sql_mode _ JavaClub全棧架構師技術筆記

MySQL 5.7默認的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官網的原文描述:“These modes were added to the default SQL mode in MySQL 5.7: The ONLY_FULL_GROUP_BYand STRICT_TRANS_TABLESmodes were added in MySQL 5.7.5. The NO_AUTO_CREATE_USERmode was added in MySQL 5.7.7. The ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE, and NO_ZERO_IN_DATEmodes 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

設置為GLOBAL,那么所有的淺談客戶端都會受到影響,不過要擁有SUPER權限才能進行設置,淺談也就是淺談root用戶,設置SESSION,淺談那么受影響的淺談只是當前的連接會話。

SET GLOBAL sql_mode ='ONLY_FULL_GROUP_BY'SET SESSION sql_mode ='ONLY_FULL_GROUP_BY'

下面我們就針對默認設置的淺談這幾種SQL mode進行詳細的講解,其他的淺談哪些大家可以去官網參考。

https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/sql-mode.html

默認的SQL mode

ONLY_FULL_GROUP_BY

設置了這個值,如果使用GROUP BY,淺談在SELECT后面出現的字段,在GROUP BY后面必須出現,不然報錯如下

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默認的sql_mode

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

那么下面的語句就會報錯,因為GROUP BY后面只有一個字段,而SELECT * 是查出所有字段,所以就報錯。

SELECT * FROM shop GROUP BY article 

這樣寫就不會報錯

SELECT * FROM shop GROUP BY article , dealer , price

不過我們不可能使用一個GROUP BY,后面還要跟著所有字段,顯然不合理,那么就應該將其關閉,只需要將其去掉就行

STRICT_TRANS_TABLES

嚴格模式控制MySQL如何處理數據更改語句中的無效或缺失值,如INSERT或UPDATE。一個值可能因多種原因無效。例如,它可能具有列的錯誤數據類型,或者它可能超出了范圍。如果要插入的新行不包含定義中沒有顯式DEFAULT子句的非null列的值,則該值缺失。

比如我們的某個字段設置不能為NULL,而我們插入的數據這個字段為NULL,那么就不能通過,就會報錯如下:

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

那么這個問題要怎么解決呢?我相信這個問題大家經常遇到,一般是我們在插入數據的時候實體的屬性沒有賦值,所以導致這個問題,所以我們會去檢查代碼,然后給屬性賦值,另外一種做法就是去除STRICT_TRANS_TABLES,這樣就不會進行校驗,不過是極其不推薦這樣做的,因為要我們要保證數據的完整性,所以必須在代碼層面做好工作。

NO_ZERO_IN_DATE

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

如下SQL的日期月和日為0,啟用了嚴格模式STRICT_TRANS_TABLES和NO_ZERO_IN_DATE,那么就會報錯。

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

去除嚴格模式STRICT_TRANS_TABLESNO_ZERO_IN_DATE就不會報錯。

NO_ZERO_DATE

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

ERROR_FOR_DIVISION_BY_ZERO

對于INSERT或者UPDATE中,如果被除數為0,那么就會產生錯誤,數據無法插入,MOD(N,M)也是一樣

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

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

SELECT price / 0  FROM shop

報錯信息: 1365 - Division by 0

NO_AUTO_CREATE_USER

不能使用grant命令創建密碼為空的用戶。

NO_ENGINE_SUBSTITUTION

如果指定了NO_ENGINE_SUBSTITUTION,我們在創建表或者修改表的時候,如果去指定了不存在或者不支持的存儲引擎,那么就會報錯,無法創建和修改,如果沒有配置NO_ENGINE_SUBSTITUTION,那么就會將我們指定的存儲引擎(不支持或者不存在)的存儲引擎替換為默認的存儲引擎,MySQL5.7后的默認存儲引擎為InnoDB,所以就會自動設置為InnoDB。

如下我們創建表,將存儲引擎設置為一個不存在的InnoDBTest,因為我們去除了NO_ENGINE_SUBSTITUTION,所以不會報錯,并且會替換成默認的InnoDB

創建sql

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

查看創建過程

SHOW CREATE TABLE store

結果

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

MySQL存儲引擎

SHOW ENGINES;

淺談MySQL的sql_mode _ JavaClub全棧架構師技術筆記

關于MySQL的SQL mode,就說到這里,我只列舉了MySQL5.7默認的幾種并對其進行講解,有興趣的話可以去了解其他的選項。感謝你的觀看,我們下期見!

生命不止,折騰不息

作者:劉牌
來源鏈接:https://www.cnblogs.com/steakliu/p/16585944.html

贊(922)
未經允許不得轉載:>貴州網站建設公司 » 淺談MySQL的sql
国产欧美精品