文件首頁
MySQL 9.0 參考手冊
相關文件 下載此手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
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 節「運算式中的校對強制性」