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 節「表示式中的定序強制轉換」。