引入
我們之前所學的表數據類型中定義 char 或者 varchar 字段, 當你寫入長度超過了你指定的長度, 他也不會報錯, 這對於mysql來說是沒有任何意義的
本篇文章主要介紹 :
- STRICT_TRANS_TABLES : 嚴格模式
- NO_ENGINE_SUBSTITUTION : 無引擎提交
- PAD_CHAR_TO_FULL_LENGTH : 填補字符到全長度
ps : char不指定寬度. 默認寬度是1, null 關鍵字沒有寬度限制
一.嚴格模式與非嚴格模式
簡單來說就是MySQL自身對數據進行嚴格的校驗(格式、長度、類型等),比如一個整型字段我們寫入一個字符串類型的數據,在非嚴格模式下MySQL不會報錯, 定義的類型長度超出了也不會報錯, 嚴格模式則會
二.不同版本的不同效果
- 5.6版本默認沒有開啓嚴格模式 規定只能存一個字符你給了多個字符, 那麼會自動幫你截取
- 5.7版本及以上或者開啓了嚴格模式 那麼規定只能存幾個 就不能超, 一旦超出範圍立刻報錯(Data too long for column ‘name’ at row 1)
三.嚴格模式的好處
使用數據庫的準則 :
能儘量少的讓數據庫幹活就儘量少, 不要給數據庫增加額外的壓力
而在非嚴格模式下, 當遇到寬度超出時, 會進行額外的截取操作這種操作就會給數據庫增加額外的壓力
換個角度來說, 本來數據的存儲就不因該超出限制範圍
四.查看當前模式的兩種方式
1.@@ 定位查找
select @@sql_mode; # 定位查找 sql 模式
select @@gtid_mode; # (這是演示)
select @@sql_notes; # (這是演示)
2.like 使用模糊匹配查找
show variables like "%mode"; # 匹配含有 mode 字符的變量
show variables like "sql%"; # 匹配含有 sql 字符的變量
五.嚴格模式開啓、關閉方式 (STRICT_TRANS_TABLES)
須知使用 set 對 SQL 模式的設置是替換操作, 想要保留原來就有的模式並添加新模式就需要將不同模式用逗號隔開
1.臨時設置
set session sql_mode='[模式]';
: 只對當前連接有效(可以省略 session)set global sql_mode='[模式]';
: 對全局有效(所有連接)
set sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'; # 開啓嚴格模式+無引擎提交(下面介紹別急,它默認就有我們就帶上)
select @@sql_mode; # 查看 sql_mode
set sql_mode='NO_ENGINE_SUBSTITUTION'; # 關閉嚴格模式(既然是替換操作,我們把嚴格模式換掉就行了)
select @@sql_mode; # 再次查看 sql_mode
2.永久設置
上面的設置方法重啓 MySQL 服務之後就失效了, 想要一勞永逸就需要寫入文件
- Linux 配置文件 my.cnf
- Windows 配置文件 my.ini
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION" # 將其配置在 [mysqld] 下面
六.無引擎提交解釋 (NO_ENGINE_SUBSTITUTION)
前面已經介紹過了存儲引擎的概念以及一些設置的方法
我們可以使用 engine=[存儲引擎]
關鍵字指定的方法進行表類型的設置
我們可以使用 show engines;
查看當前 mysql 所支持的存儲引擎
我們可以使用 show variables like 'storage_engine%';
模糊匹配當前正在使用的存儲引擎
那麼我們在指定的時候設置的是 MySQL 不支持的存儲引擎, MySQL會怎麼做呢?
1.添加了 : NO_ENGINE_SUBSTITUTION 的情況下
- 當我們 create table 時指定的 engine 項不被支持, 這個時候 MySQL 會報錯
2.沒添加 : NO_ENGINE_SUBSTITUTION 的情況下
- create table 時指定的 engine 項不被支持, MySQL 會把表的存儲引擎改爲 Innodb, 也就是該成默認存儲引擎
3.設置方法與嚴格模式設置一樣
七.填補字符到全長度 (PAD_CHAR_TO_FULL_LENGTH)
我們在定義表某一個字段爲 char 類型的時候,會往右填充空格來滿足你指定的字符長度, 例如指定長度爲5, 存大於5字符報錯, 小於5就以空格填充到5個字符存儲
但在查詢時, 查出的結果會自動刪除尾部的空格
而設置SQL模式可以讓其不刪除空格顯示
set sql_mode='pad_char_to_full_length'; # sql模式的方法都一樣,要保留之前的模式就使用逗號隔開
set sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,PAD_CHAR_TO_FULL_LENGTH';