字串文字、十六進位文字或位元值文字可以具有選用的字元集引介符和 COLLATE
子句,以將其指定為使用特定字元集和校對的字串。
[_charset_name] literal [COLLATE collation_name]
_
運算式正式稱為引介符。它會告知剖析器,「後面的字串使用字元集 charset_name
charset_name
。」引介符不會像 CONVERT()
那樣將字串變更為引介符字元集。它不會變更字串值,但可能會發生填補。引介符只是一個訊號。
對於字串文字,允許在引介符和字串之間有空格,但這不是必要的。
對於字元集文字,引介符表示後續字串的字元集,但不會變更剖析器在字串內執行跳脫處理的方式。跳脫符號一律會由剖析器根據 character_set_connection
所給定的字元集來解譯。如需其他討論和範例,請參閱第 12.3.6 節:「字串文字字元集與校對」。
範例
SELECT 'abc';
SELECT _latin1'abc';
SELECT _binary'abc';
SELECT _utf8mb4'abc' COLLATE utf8mb4_danish_ci;
SELECT _latin1 X'4D7953514C';
SELECT _utf8mb4 0x4D7953514C COLLATE utf8mb4_danish_ci;
SELECT _latin1 b'1000001';
SELECT _utf8mb4 0b1000001 COLLATE utf8mb4_danish_ci;
字元集引介符和 COLLATE
子句會根據標準 SQL 規格實作。
字串文字可以使用 _binary
引介符指定為二進位字串。十六進位文字和位元值文字預設為二進位字串,因此允許使用 _binary
,但通常不是必要的。_binary
可能有助於在文字另外被視為數字的內容中,將十六進位或位元文字保留為二進位字串。例如,位元運算允許在 MySQL 8.4 及更高版本中使用數值或二進位字串引數,但預設會將十六進位和位元文字視為數字。若要明確指定此類文字的二進位字串內容,請為至少一個引數使用 _binary
引介符
mysql> SET @v1 = X'000D' | X'0BC0';
mysql> SET @v2 = _binary X'000D' | X'0BC0';
mysql> SELECT HEX(@v1), HEX(@v2);
+----------+----------+
| HEX(@v1) | HEX(@v2) |
+----------+----------+
| BCD | 0BCD |
+----------+----------+
顯示的結果在兩種位元運算中看起來都很相似,但是沒有 _binary
的結果是 BIGINT
值,而有 _binary
的結果則是二進位字串。由於結果類型不同,顯示的值也會不同:數值結果不會顯示高位 0 位數。
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
必須是連線預設字元集允許的校對。對於十六進位文字或位元值文字,唯一允許的校對是
binary
,因為這些文字類型預設為二進位字串。
否則 (既未指定
_charset_name
也未指定COLLATE
)collation_name
對於字串文字,會使用
character_set_connection
和collation_connection
系統變數所給定的連線預設字元集和校對。對於十六進位文字或位元值文字,字元集和校對為
binary
。
範例
具有
latin1
字元集和latin1_german1_ci
校對的非二進位字串SELECT _latin1'Müller' COLLATE latin1_german1_ci; SELECT _latin1 X'0A0D' COLLATE latin1_german1_ci; SELECT _latin1 b'0110' COLLATE latin1_german1_ci;
具有
utf8mb4
字元集及其預設校對 (即utf8mb4_0900_ai_ci
) 的非二進位字串SELECT _utf8mb4'Müller'; SELECT _utf8mb4 X'0A0D'; SELECT _utf8mb4 b'0110';
具有
binary
字元集及其預設校對 (即binary
) 的二進位字串SELECT _binary'Müller'; SELECT X'0A0D'; SELECT b'0110';
十六進位文字和位元值文字不需要引介符,因為它們預設為二進位字串。
具有連線預設字元集和
utf8mb4_0900_ai_ci
校對的非二進位字串 (如果連線字元集不是utf8mb4
,則會失敗)SELECT 'Müller' COLLATE utf8mb4_0900_ai_ci;
這種建構方式(僅限
COLLATE
)不適用於十六進位字面值或位元字面值,因為無論連線字元集為何,它們的字元集都是binary
,且binary
與utf8mb4_0900_ai_ci
校對不相容。在沒有引入器的情況下,唯一允許的COLLATE
子句是COLLATE binary
。使用連線預設字元集和校對的字串
SELECT 'Müller';