SQL 模式控制 MySQL / MariaDB DBMS 引擎(數據庫管理系統)理解語法并驗證為其處理的數據的方式。我們可以將其與具有不同規則集的游戲進行比較,每個玩家在玩之前都必須同意。
UNO 類比
讓我們以UNO紙牌游戲為例。有很多變體,但我們可以這樣總結:
變體 | 影響 |
---|---|
雙倍的 | 如果它們完全相同,每個玩家都可以同時放下幾張牌 |
攔截 | 如果玩家的牌與剛剛放下的牌完全相同,他可以打出自己的牌,即使輪不到他 |
STRAIGHT_FLUSH | 如果每個玩家按照數字順序并且顏色相同,則可以同時放下多張牌 |
在開始玩之前,定義uno_mode=DOUBLE,INTERCEPTION,這意味著該?STRAIGHT_FLUSH規則不適用。如果此規則在游戲后期激活,可能會導致牌桌出現問題,一些玩家可能在前幾輪中處于劣勢,可能不想再玩了。
管理數據的紙牌游戲?
SQL 模式的工作原理是這樣的,但它不是指定如何打牌,而是指定在某些情況下要做什么:
- “2020-11-00”是有效日期(NO_ZERO_IN_DATE)嗎?它更改了 DBMS 執行的數據驗證。
- 是SELECT name FROM users GROUP BY first_name有效的查詢 (?ONLY_FULL_GROUP_BY) 嗎?它更改了允許的語法。
當 MariaDB 10.2 和 MySQL 5.7 發布時,規則發生了變化:
數據庫管理系統 | 默認 SQL_Mode |
---|---|
瑪麗亞數據庫 10.1 | NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER |
瑪麗亞數據庫 10.2 | STRICT_TRANS_TABLES、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION |
MySQL 5.6 | NO_ENGINE_SUBSTITUTION |
MySQL 5.7 | 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 |
我們可以注意到,較新的版本保留了舊規則,但添加了新規則。這就是為什么當從 MariaDB 10.1 升級到 MariaDB 10.2 時,必須指定其數據庫使用舊規則,而不是強制執行STRICT_TRANS_TABLES, ERROR_FOR_DIVISION_BY_ZERO.
具體來說
實際上,如果我的網站應該存儲除法的結果,但分母是“0”,我的 MariaDB 10.1 默認 SQL 模式數據庫的數據庫將允許它并將結果存儲為NULL.?我使用 MariaDB 10.2 默認 SQL 模式的數據庫也將允許并存儲一個NULL值,但會引發警告。如果還啟用了嚴格模式,MariaDB 10.2 將拋出錯誤并且不存儲任何內容。因此,更改 SQL 模式可能會破壞網站,因此應謹慎操作。
由于我們無法檢查每個客戶的每個網站的每一行代碼,當計劃進行更改默認 SQL 模式的 DBMS 重大升級時,會激活舊 SQL 模式,以確保您的網站不會受到影響。當然,您可以在 CloudDB 的“配置”選項卡中切換到新的默認 SQL 模式。但請記住,這適用于有經驗的用戶,建議堅持使用默認的 sql_mode,除非您的數據庫是從具有不同默認 sql_mode 的先前版本升級的。