Navicat 部落格

MySQL 預設值:是好是壞?- 第 1 部分:嚴格 SQL 模式 2020 年 5 月 22 日,由 Robert Gravelle 撰寫

第 1 部分:嚴格 SQL 模式

當你沒有為不可為 null 的欄提供數值時出現錯誤可能會令你倍感煩惱。有一種方法可以透過為這些欄設定預設值來將此類錯誤發生的機會降至最低。似乎很容易解決,但就如所有事情,魔鬼是在細節中。你必須格外小心,不要為了簡化 INSERT 而在資料表中加入一堆一般且無用的資料。在今天的文章中,我們將學習 MySQL 的嚴格 SQL 模式的影響,以及如何使用 Navicat for MySQL 15 檢視和設定它。而在第 2 部分中,我們將介紹在什麼情況下採用預設值(以及何時不採用)。

嚴格 SQL 模式與調整值

在MySQL中,你可以透過啟用嚴格 SQL 模式來控制 MySQL 如何處理資料變更陳述式(例如 INSERT 或 UPDATE 陳述式)中的無效值或遺漏值。當要插入的新列時不包含其定義中沒有顯式 DEFAULT 子句的不可為 NULL 欄的值時,會出現遺漏值。如果嚴格模式無效,MySQL 將為無效或遺漏值插入調整值,並產生警告提示。調整值的例子有空字串、零和0000-00-00 00:00:00 的時間戳記或日期。

很明顯,調整值可能會破壞預設值的整體作用。因此,通常最好使用 STRICT SQL 模式並在適當的地方提供預設值。在 Navicat 中,你可以在伺服器監控器的「變數」索引標籤上檢查 SQL 模式的目前值。你可以在主功能表中的「工具」>「伺服器監控器」下找到它。

sql_mode_variable (119K)

如果 sql_mode 的值有 STRICT_ALL_TABLES 或 STRICT_TRANS_TABLES,則已啟用嚴格 SQL 模式。在決定使用哪種模式時,請注意後者更為寬容,因為如果有遺漏值,MySQL 會 為欄資料類型插入適當的調整值,並產生一則警告而不是錯誤訊息。而且,陳述式會繼續處理。與此同時,無效值會被轉換為最接近的有效值。

嚴格 SQL 模式執行

讓我們使用 Sakila 範例資料庫比較嚴格 SQL 模式與預設 SQL模式。actor 資料表不允許任何欄為 null,如「不是 null」標題下的核取方塊所示:

actor_table_definition (62K)

如果我們使用 SET 命令為目前階段作業停用嚴格 SQL 模式,並執行僅提供 last_name 的 INSERT 陳述式。這個情況下,資料庫會接受這個陳述式,但會為 first_name 提供空白字串:

insert_statement (43K)

actor_with_missing_first_name (31K)

如果我們重新啟用嚴格模式,現在相同的 INSERT 陳述式會失敗,並顯示一則錯誤訊息:

actor_with_missing_first_name_strict_mode (61K)

總結

在今天的文章中,我們了解了 MySQL 嚴格 SQL 模式的影響,以及如何使用 Navicat for MySQL 15檢視和設定它。在第 2 部分中,我們將介紹何時使用或不使用預設值。

Navicat 文章
頻道記錄
分享
部落格封存檔