文件首頁
MySQL 9.0 參考手冊
相關文件 下載此手冊
PDF (美國信紙) - 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.3.8 字元集引入器

字串常值、十六進位常值或位元值常值可以選擇性地具有字元集引入器和 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 9.0 和更高版本中允許數值或二進位字串引數,但預設會將十六進位和位元常值視為數字。若要明確為這類常值指定二進位字串內容,請為至少其中一個引數使用 _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_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 必須是連線預設字元集的允許校對。

    • 對於十六進位常值或位元值常值,唯一允許的校對是 binary,因為這些類型的常值預設為二進位字串。

  • 否則 (既未指定 _charset_name 也未指定 COLLATE collation_name)

範例

  • 字元集為 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,且 binaryutf8mb4_0900_ai_ci 校對規則不相容。在沒有引導符的情況下,唯一允許的 COLLATE 子句是 COLLATE binary

  • 一個具有連線預設字元集和校對規則的字串

    SELECT 'Müller';