每個字元字串常值都有一個字元集和校對。
對於簡單的陳述式 SELECT '
,該字串具有由 string
'character_set_connection
和 collation_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_name
和COLLATE
,則會使用字元集collation_name
charset_name
和校對collation_name
。collation_name
必須是charset_name
允許的校對。如果指定了
_charset_name
,但未指定COLLATE
,則會使用字元集charset_name
及其預設校對。若要查看每個字元集的預設校對,請使用SHOW CHARACTER SET
陳述式或查詢INFORMATION_SCHEMA
CHARACTER_SETS
表格。如果未指定
_charset_name
,但指定了COLLATE
,則會使用由collation_name
character_set_connection
系統變數指定的連線預設字元集和校對collation_name
。collation_name
必須是連線預設字元集允許的校對。否則(未指定
_charset_name
和COLLATE
),則會使用由collation_name
character_set_connection
和collation_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
(如 第 12.4 節,「連線字元集和校對」中所述,會變更 character_set_connection
),並使用 HEX()
函式顯示產生的字串,以便查看確切的字串內容。
範例 1
mysql> SET NAMES latin1;
mysql> SELECT HEX('à\n'), HEX(_sjis'à\n');
+------------+-----------------+
| HEX('à\n') | HEX(_sjis'à\n') |
+------------+-----------------+
| E00A | E00A |
+------------+-----------------+
在此,à
(十六進位值 E0
)後面接著 \n
,這是換行符號的逸出序列。逸出序列會使用 character_set_connection
的值 latin1
解譯,以產生常值換行符號(十六進位值 0A
)。即使對於第二個字串,也會發生這種情況。也就是說,_sjis
引導詞不會影響剖析器的逸出處理。
範例 2
mysql> SET NAMES sjis;
mysql> SELECT HEX('à\n'), HEX(_latin1'à\n');
+------------+-------------------+
| HEX('à\n') | HEX(_latin1'à\n') |
+------------+-------------------+
| E05C6E | E05C6E |
+------------+-------------------+
在此,character_set_connection
是 sjis
,這是一個字元集,其中 à
後面接著 \
的序列(十六進位值 05
和 5C
)是有效的多位元組字元。因此,字串的前兩個位元組會被解譯為單一 sjis
字元,而 \
不會被解譯為逸出字元。後續的 n
(十六進位值 6E
)不會被解譯為逸出序列的一部分。即使對於第二個字串,也是如此;_latin1
引導詞不會影響逸出處理。