[译] MySQL 字符集介绍

原文的地址: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 collat​​ion_name,则使用字符集 charset_name 和排序规则 collat​​ion_name。 collat​​ion_name 必须是 charset_name 的允许归类。

  • 如果指定了 _charset_name 但未指定 COLLATE,则使用字符集charset_name 及其缺省归类。要查看每个字符集的默认排序规则,请使用 SHOW CHARACTER SET
    语句。

  • 如果未指定 _charset_name 但指定了 COLLATE collat​​ion_name:

    • 对于字符串值,使用由 character_set_connection
      系统变量和排序规则collat​​ion_name 给出的连接缺省字符集。collat​​ion_name 必须是连接默认字符集的允许排序规则。

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

  • 否则(既不指定 _charset_name 也不指定 COLLATE collat​​ion_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”]。

你可能感兴趣的:([译] MySQL 字符集介绍)