Metadata 是 「關於資料的資料。」 任何描述資料庫的事物 — 相對於資料庫的內容 — 都是 metadata。因此,欄位名稱、資料庫名稱、使用者名稱、版本名稱,以及來自 SHOW
的大部分字串結果都是 metadata。這對於 INFORMATION_SCHEMA
中表格的內容也適用,因為這些表格根據定義包含關於資料庫物件的資訊。
Metadata 的表示法必須滿足下列要求
為了滿足這兩項要求,MySQL 會將 metadata 儲存在 Unicode 字元集(即 UTF-8)中。如果您從未使用帶重音或非拉丁字元,這不會造成任何中斷。但如果您使用,您應該注意 metadata 是採用 UTF-8 編碼。
Metadata 要求表示 USER()
、CURRENT_USER()
、SESSION_USER()
、SYSTEM_USER()
、DATABASE()
和 VERSION()
函數的傳回值預設採用 UTF-8 字元集。
伺服器會將 character_set_system
系統變數設定為 metadata 字元集的名稱
mysql> SHOW VARIABLES LIKE 'character_set_system';
+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| character_set_system | utf8mb3 |
+----------------------+---------+
使用 Unicode 儲存 metadata 並不表示伺服器預設會以 character_set_system
字元集傳回欄位的標頭和 DESCRIBE
函數的結果。當您使用 SELECT column1 FROM t
時,名稱 column1
本身會以 character_set_results
系統變數值所決定的字元集,從伺服器傳回至用戶端,此變數的預設值為 utf8mb4
。如果您希望伺服器以不同的字元集傳回 metadata 結果,請使用 SET NAMES
陳述式強制伺服器執行字元集轉換。SET NAMES
會設定 character_set_results
和其他相關的系統變數。(請參閱第 12.4 節「連線字元集與校對」。)或者,用戶端程式可以在收到伺服器的結果後執行轉換。用戶端執行轉換效率較高,但並非所有用戶端都可使用此選項。
如果 character_set_results
設定為 NULL
,則不會執行轉換,而且伺服器會使用其原始字元集(由 character_set_system
指示的集合)傳回 metadata。
從伺服器傳回至用戶端的錯誤訊息會自動轉換為用戶端字元集,就像 metadata 一樣。
如果您(例如)在單一陳述式中比較或指派 USER()
函數,請不用擔心。MySQL 會為您執行一些自動轉換。
SELECT * FROM t1 WHERE USER() = latin1_column;
之所以可以運作,是因為 latin1_column
的內容在比較之前會自動轉換為 UTF-8。
INSERT INTO t1 (latin1_column) SELECT USER();
之所以可以運作,是因為 USER()
的內容在指派之前會自動轉換為 latin1
。
雖然自動轉換並未在 SQL 標準中,但標準的確說明每個字元集(在支援的字元方面)都是 Unicode 的 「子集」。由於「適用於超集合的事物可以適用於子集」是一個眾所周知的原則,因此我們認為 Unicode 的校對可以適用於與非 Unicode 字串的比較。如需關於字串強制轉換的詳細資訊,請參閱第 12.8.4 節「運算式中的校對強制性」。