文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


12.2.2 Metadata 的 UTF-8

Metadata關於資料的資料」。任何描述資料庫的內容(相對於資料庫的內容)都是 metadata。因此,欄位名稱、資料庫名稱、使用者名稱、版本名稱以及來自 SHOW 的大多數字串結果都是 metadata。 INFORMATION_SCHEMA 中表格的內容也是如此,因為這些表格的定義包含關於資料庫物件的資訊。

Metadata 的表示必須滿足以下要求

  • 所有 metadata 必須使用相同的字元集。否則,SHOW 陳述式和 INFORMATION_SCHEMA 中表格的 SELECT 陳述式都無法正常運作,因為這些操作結果的同一欄位中的不同列會使用不同的字元集。

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