# 10.3.8字符集介绍人

字符串文字、十六进制文字或位值文字可以有可选的字符集引入器和整理子句,将其指定为使用特定字符集和排序规则的字符串:

[_charset_name] literal [COLLATE collation_name]

这个_*charset_名称*这个表达形式上被称为介绍人它告诉解析器,“后面的字符串使用字符集*charset_名称*“介绍人不会像这样将字符串更改为介绍人字符集CONVERT()可以。虽然可能会出现填充,但它不会更改字符串值。介绍人只是一个信号。

对于字符串文字,介绍人和字符串之间的空格是允许的,但是可选的。

对于字符集文字,介绍人指示以下字符串的字符集,但不会更改解析器在字符串中执行转义处理的方式。转义总是由解析器根据字符集连接。有关更多讨论和示例,请参阅第10.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;

角色集介绍人和整理子句是根据标准SQL规范实现的。

通过使用_二进制的介绍人。默认情况下,十六进制文字和位值文字是二进制字符串,所以_二进制的是允许的,但通常是不必要的。_二进制的在文本被视为数字的上下文中,将十六进制或位文本保留为二进制字符串可能很有用。例如,在MySQL 8.0及更高版本中,位操作允许使用数字或二进制字符串参数,但默认情况下将十六进制和位文本视为数字。要显式指定此类文本的二进制字符串上下文,请使用_二进制的至少一个论点的介绍人:

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     |
+----------+----------+

两个位操作的显示结果相似,但结果不一致_二进制的是一个比金值,而结果是_二进制的是一个二进制字符串。由于结果类型不同,显示的值也不同:数字结果不显示高阶0位。

MySQL通过以下方式确定字符串文字、十六进制文字或位值文字的字符集和排序规则:

  • 如果两者都有*_charset_名称整理*排序规则名称*指定的字符集charset_名称整理排序规则名称都用过了。排序规则名称必须是允许的排序规则charset_名称*.

  • 如果*_charset_名称已指定,但整理未指定,字符集charset_名称*并使用其默认排序规则。要查看每个字符集的默认排序规则,请使用显示字符集声明或查询信息模式 字符集桌子

  • 如果*_charset_名称*未指定,但整理*排序规则名称*具体规定如下:

    • 对于字符串文字,连接默认字符集由字符集连接系统变量和排序规则*排序规则名称都用过了。排序规则名称*必须是连接默认字符集允许的排序规则。

    • 对于十六进制文字或位值文字,唯一允许的排序规则是二进制的因为默认情况下,这些类型的文本是二进制字符串。

  • 否则(两者都不是*_charset_名称*也没有整理*排序规则名称*(已指定):

    • 对于字符串文字,连接默认字符集和排序规则由字符集连接校对连接使用系统变量。

    • 对于十六进制文字或位值文字,字符集和排序规则是二进制的.

    例如:

  • 拉丁语1字符集和拉丁语整理:

    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';
    
  • 二进制的字符集及其默认排序规则(即,二进制的):

    SELECT _binary'Müller';
    SELECT X'0A0D';
    SELECT b'0110';
    

    十六进制文字和位值文字不需要引入符,因为默认情况下它们是二进制字符串。

  • 具有连接默认字符集和utf8mb4_0900_ai_ci排序规则(如果未指定连接字符集,则失败)utf8mb4):

    SELECT 'Müller' COLLATE utf8mb4_0900_ai_ci;
    

    这个建筑(整理仅适用于)不适用于十六进制文字或位文字,因为它们的字符集是二进制的无论连接字符集是什么二进制的不符合utf8mb4_0900_ai_ci整理。唯一允许的整理没有介绍人的条款是整理二进制文件.

  • 具有连接默认字符集和排序规则的字符串:

    SELECT 'Müller';