文件首頁
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


MySQL 8.4 參考手冊  /  ...  /  字元字串常值的字元集和校對

12.3.6 字元字串常值的字元集和校對

每個字元字串常值都有一個字元集和一個校對。

對於簡單的陳述式 SELECT 'string',字串具有由 character_set_connectioncollation_connection 系統變數定義的連線預設字元集和校對。

字元字串常值可以具有可選的字元集引導符和 COLLATE 子句,以將其指定為使用特定字元集和校對的字串。

[_charset_name]'string' [COLLATE collation_name]

_charset_name 運算式正式稱為引導符。它告訴剖析器:「後面的字串使用字元集 charset_name」引導符不會像 CONVERT() 那樣將字串變更為引導符字元集。它不會變更字串值,但可能會發生填補。引導符只是一個訊號。請參閱章節 12.3.8,「字元集引導符」

範例

SELECT 'abc';
SELECT _latin1'abc';
SELECT _binary'abc';
SELECT _utf8mb4'abc' COLLATE utf8mb4_danish_ci;

字元集引導符和 COLLATE 子句是根據標準 SQL 規範實作的。

MySQL 以下列方式判斷字元字串常值的字元集和校對

  • 如果同時指定了 _charset_nameCOLLATE collation_name,則會使用字元集 charset_name 和校對 collation_namecollation_name 必須是 charset_name 的允許校對。

  • 如果指定了 _charset_name 但未指定 COLLATE,則會使用字元集 charset_name 及其預設校對。若要查看每個字元集的預設校對,請使用 SHOW CHARACTER SET 陳述式或查詢 INFORMATION_SCHEMA CHARACTER_SETS 資料表。

  • 如果未指定 _charset_name 但指定了 COLLATE collation_name,則會使用由 character_set_connection 系統變數給定的連線預設字元集和校對 collation_namecollation_name 必須是連線預設字元集的允許校對。

  • 否則(既未指定 _charset_name 也未指定 COLLATE collation_name),則會使用由 character_set_connectioncollation_connection 系統變數給定的連線預設字元集和校對。

範例

  • 具有 latin1 字元集和 latin1_german1_ci 校對的非二進位字串

    SELECT _latin1'Müller' COLLATE latin1_german1_ci;
  • 具有 utf8mb4 字元集及其預設校對 (即 utf8mb4_0900_ai_ci) 的非二進位字串

    SELECT _utf8mb4'Müller';
  • 具有 binary 字元集及其預設校對 (即 binary) 的二進位字串

    SELECT _binary'Müller';
  • 具有連線預設字元集和 utf8mb4_0900_ai_ci 校對的非二進位字串(如果連線字元集不是 utf8mb4,則會失敗)

    SELECT 'Müller' COLLATE utf8mb4_0900_ai_ci;
  • 具有連線預設字元集和校對的字串

    SELECT 'Müller';

引導符表示後續字串的字元集,但不會變更剖析器如何執行字串內的逸出處理。逸出符號一律由剖析器根據 character_set_connection 給定的字元集進行解譯。

以下範例顯示,即使存在引導符,逸出處理也會使用 character_set_connection 發生。範例使用 SET NAMES (它會變更 character_set_connection,如章節 12.4,「連線字元集和校對」中所述),並使用 HEX() 函數顯示產生的字串,以便查看確切的字串內容。

範例 1

mysql> SET NAMES latin1;
mysql> SELECT HEX('à\n'), HEX(_sjis'à\n');
+------------+-----------------+
| HEX('à\n')  | HEX(_sjis'à\n')  |
+------------+-----------------+
| E00A       | E00A            |
+------------+-----------------+

在此範例中,à (十六進位值 E0) 後面接著 \n,這是換行的逸出序列。逸出序列會使用 latin1character_set_connection 值進行解譯,以產生文字換行 (十六進位值 0A)。即使對於第二個字串,也會發生這種情況。也就是說,_sjis 引導符不會影響剖析器的逸出處理。

範例 2

mysql> SET NAMES sjis;
mysql> SELECT HEX('à\n'), HEX(_latin1'à\n');
+------------+-------------------+
| HEX('à\n')  | HEX(_latin1'à\n')  |
+------------+-------------------+
| E05C6E     | E05C6E            |
+------------+-------------------+

在此,character_set_connectionsjis,一種字元集,其中 à 後面接著 \ (十六進位值 055C)的序列是一個有效多位元組字元。因此,字串的前兩個位元組被解釋為單個 sjis 字元,而 \ 不會被解釋為跳脫字元。後面的 n(十六進位值 6E)也不會被解釋為跳脫序列的一部分。即使是第二個字串也是如此;_latin1 引導詞不會影響跳脫處理。