原文的地址:https://dev.mysql.com/doc/refman/5.6/en/charset-introducer.html
字符串、十六进制、位(Bit)的字面值可以设置 introducer 的字符集和 COLLATE 配置,以将其指定为使用特定字符集和 collation 的字符串:
[_charset_name] literal [COLLATE collation_name]
字符集 introducer 和 COLLATE 子句是根据标准 SQL 规范实现的。
示例:
SELECT 'abc';
SELECT _latin1'abc';
SELECT _binary'abc';
SELECT _utf8'abc' COLLATE utf8_danish_ci;
SELECT _latin1 X'4D7953514C';
SELECT _utf8 0x4D7953514C COLLATE utf8_danish_ci;
SELECT _latin1 b'1000001';
SELECT _utf8 0b1000001 COLLATE utf8_danish_ci;
_charset_name 表达式被称为 introducer。它告诉解析器,“以下字符串使用字符集 _charset_name。” introducer 不会像 CONVERT()
一样将字符串改为 introducer 所代表的字符集。虽然可能会发生填充,但它不会更改字符串值。introducer 只是一个标记。
对于字符串值,introducer 和字符串之间的空格是允许的,但是可选。
可以使用 _binary introducer 将字符串值指定为二进制字符串。默认情况下,十六进制、位值都是二进制字符串,因此允许 _binary,但不必要。
MySQL 以下列方式确定字符串、十六进制、位值字面值的字符集和排序规则:
如果同时指定了 _charset_name 和 COLLATE collation_name,则使用字符集 charset_name 和排序规则 collation_name。 collation_name 必须是 charset_name 的允许归类。
如果指定了 _charset_name 但未指定 COLLATE,则使用字符集charset_name 及其缺省归类。要查看每个字符集的默认排序规则,请使用 SHOW CHARACTER SET
语句。-
如果未指定 _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;
SELECT _latin1 X'0A0D' COLLATE latin1_german1_ci;
SELECT _latin1 b'0110' COLLATE latin1_german1_ci;
- utf8 字符集和其默认排序规则的非二进制字符串(即utf8_general_ci):
SELECT _utf8'Müller';
SELECT _utf8 X'0A0D';
SELECT _utf8 b'0110';
- 二进制字符集和其默认排序规则(即二进制)的二进制字符串:
SELECT _binary'Müller';
SELECT X'0A0D';
SELECT b'0110';
十六进制和位值文字不需要 introducer ,因为它们本身就是二进制字符串。
- 连接默认字符集和 utf8_general_ci 排序规则的非二进制字符串(如果连接字符集不是 utf8 则失败):
SELECT 'Müller' COLLATE utf8_general_ci;
此构造(仅COLLATE)不适用于十六进制或位类型,因为它们的字符集是二进制的,不管连接字符集,并且二进制与 utf8_general_ci 排序规则不兼容。缺少 introducer 时,唯一允许的 COLLATE 条件是 COLLATE 是二进制。
- 连接默认字符集和排序规则的字符串:
SELECT 'Müller';
对于字符集字面量,introducer 指示以下字符串的字符集,但不会更改解析器在字符串中执行转义处理的方式。转义总是由解析器根据 character_set_connection 给出的字符集进行解释。有关其他讨论和示例,请参见 [Section 10.1.3.6, “Character String Literal Character Set and Collation”]。