10.3.8 字符集简介
字符串 Literals,十六进制 Literals 或位值 Literals 可以具有可选的字符集介绍程序和COLLATE
子句,以将其指定为使用特定字符集和排序规则的字符串:
[_charset_name] literal [COLLATE collation_name]
_charset_name
table 达式正式称为* introducer 。它告诉解析器,“后面的字符串使用字符集 charset_name
*。”引入程序不会像CONVERT()那样将字符串更改为引入程序字符集。尽管可能会发生填充,但它不会更改字符串值。引入器只是一个 signal。
对于字符串 Literals,导引符和字符串之间的空格是允许的,但是可选的。
对于字符集 Literals,介绍程序指示以下字符串的字符集,但不更改解析器在字符串内执行转义处理的方式。解析器始终根据character_set_connection给出的字符集来解释转义。有关其他讨论和示例,请参见第 10.3.6 节“字符字符串 Literals 字符集和排序规则”。
Examples:
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;
字符集介绍程序和COLLATE
子句是根据标准 SQL 规范实现的。
可以使用_binary
简介将字符串 Literals 指定为二进制字符串。十六进制 Literals 和位值 Literals 默认情况下是二进制字符串,因此_binary
是允许的,但不必要。
MySQL 通过以下方式确定字符串 Literals,十六进制 Literals 或位值 Literals 的字符集和排序规则:
-
如果同时指定了*
_charset_name
和COLLATE collation_name
,则使用字符集charset_name
和排序规则collation_name
*。 *collation_name
必须是charset_name
*的允许排序规则。 -
如果指定*
_charset_name
但未指定COLLATE
,则使用字符集charset_name
*及其默认归类。要查看每个字符集的默认排序规则,请使用显示字符集语句或查询INFORMATION_SCHEMA
CHARACTER_SETStable。 -
如果未指定*
_charset_name
*但指定了COLLATE collation_name
: -
对于字符串 Literals,使用character_set_connection系统变量和归类*
collation_name
*给定的连接默认字符集。 *collation_name
*必须是连接默认字符集允许的归类。- 对于十六进制 Literals 或位值 Literals,唯一允许的排序规则是
binary
,因为默认情况下这些 Literals 类型是二进制字符串。
- 对于十六进制 Literals 或位值 Literals,唯一允许的排序规则是
-
否则(未指定*
_charset_name
*或COLLATE collation_name
): -
对于字符串 Literals,将使用character_set_connection和collation_connection系统变量给出的连接默认字符集和排序规则。
- 对于十六进制 Literals 或位值 Literals,字符集和排序规则为
binary
。
- 对于十六进制 Literals 或位值 Literals,字符集和排序规则为
Examples:
- 具有
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';
- 具有
binary
字符集及其默认排序规则(即binary
)的二进制字符串:
SELECT _binary'Müller';
SELECT X'0A0D';
SELECT b'0110';
十六进制 Literals 和位值 Literals 不需要引入符,因为默认情况下它们是二进制字符串。
- 具有连接默认字符集和
utf8_general_ci
排序规则的非二进制字符串(如果连接字符集不是utf8
,则失败):
SELECT 'Müller' COLLATE utf8_general_ci;
此构造(仅COLLATE
)不适用于十六进制 Literals 或位 Literals,因为无论连接字符集如何,其字符集均为binary
,并且binary
与utf8_general_ci
排序规则不兼容。在没有简介的情况下,唯一允许的COLLATE
子句是COLLATE binary
。
- 具有连接默认字符集和排序规则的字符串:
SELECT 'Müller';