# 10.2.1 角色集曲目

字符集的曲目是该集中字符的集合。

字符串表达式有一个 repertoire 属性,它可以有两个值:

  • ASCII: 表达式只能包含 ASCII 字符;即 Unicode 范围内的字符U+0000U+007F.

  • 统一码: 表达式可以包含 Unicode 范围内的字符U+0000U+10FFFF.这包括基本多语言平面 (BMP) 范围内的字符 (U+0000U+FFFF) 和 BMP 范围之外的补充字符 (U+10000U+10FFFF)。

    ASCII范围是统一码范围,所以一个字符串ASCII曲目可以安全地转换为任何字符串的字符集而不会丢失信息统一码曲目。它也可以安全地转换为任何字符集的超集ascii字符集。(所有 MySQL 字符集都是ascii除了swe7,它为瑞典重音字符重用了一些标点符号。)

    在许多情况下,如果排序规则强制规则不足以解决歧义,MySQL 会返回“非法混合排序规则”错误,使用曲目可以在表达式中进行字符集转换。(有关强制力的信息,请参阅第 10.8.4 节,“表达式中的排序规则强制性”.)

    以下讨论提供了表达式及其曲目的示例,并描述了曲目的使用如何更改字符串表达式的评估:

  • 字符串常量的曲目取决于字符串内容,并且可能与字符串字符集的曲目不同。考虑这些陈述:

    SET NAMES utf8mb4; SELECT 'abc';
    SELECT _utf8mb4'def';
    

    虽然字符集是utf8mb4在上述每种情况下,字符串实际上不包含任何超出 ASCII 范围的字符,因此它们的曲目是ASCII而不是统一码.

  • 一列具有ascii字符集有ASCII剧目,因为它的字符集。在下表中,c1ASCII曲目:

    CREATE TABLE t1 (c1 CHAR(1) CHARACTER SET ascii);
    

    以下示例说明了在没有曲目的情况下发生错误的情况下曲目如何使结果确定:

    CREATE TABLE t1 (
      c1 CHAR(1) CHARACTER SET latin1,
      c2 CHAR(1) CHARACTER SET ascii
    );
    INSERT INTO t1 VALUES ('a','b');
    SELECT CONCAT(c1,c2) FROM t1;
    

    没有repertoire,就会出现这个错误:

    ERROR 1267 (HY000): Illegal mix of collations (latin1_swedish_ci,IMPLICIT)
    and (ascii_general_ci,IMPLICIT) for operation 'concat'
    

    使用曲目,子集到超集(ascii拉丁语1) 转换可能发生并返回结果:

    +---------------+
    | CONCAT(c1,c2) |
    +---------------+
    | ab            |
    +---------------+
    
  • 具有一个字符串参数的函数会继承其参数的全部内容。的结果UPPER(_utf8mb4'abc')ASCII曲目,因为它的论点有ASCII曲目。(尽管_utf8mb4介绍人,字符串'abc'不包含 ASCII 范围之外的字符。)

  • 对于返回字符串但没有字符串参数的函数并使用字符集连接作为结果字符集,结果曲目为ASCII如果字符集连接ascii, 和统一码否则:

    FORMAT(numeric_column, 4);
    

    曲目的使用改变了 MySQL 评估以下示例的方式:

    SET NAMES ascii;
    CREATE TABLE t1 (a INT, b VARCHAR(10) CHARACTER SET latin1);
    INSERT INTO t1 VALUES (1,'b');
    SELECT CONCAT(FORMAT(a, 4), b) FROM t1;
    

    没有repertoire,就会出现这个错误:

    ERROR 1267 (HY000): Illegal mix of collations (ascii_general_ci,COERCIBLE)
    and (latin1_swedish_ci,IMPLICIT) for operation 'concat'
    

    使用曲目,返回一个结果:

    +-------------------------+
    | CONCAT(FORMAT(a, 4), b) |
    +-------------------------+
    | 1.0000b                 |
    +-------------------------+
    
  • 具有两个或更多字符串参数的函数使用“最宽”参数曲目作为结果曲目,其中统一码ASCII.考虑以下连接()调用:

    CONCAT(_ucs2 X'0041', _ucs2 X'0042')
    CONCAT(_ucs2 X'0041', _ucs2 X'00C2')
    

    对于第一次通话,曲目是ASCII因为两个参数都在 ASCII 范围内。对于第二次通话,曲目是统一码因为第二个参数超出了 ASCII 范围。

  • 函数返回值的曲目仅基于影响结果字符集和排序规则的那些参数的曲目确定。

    IF(column1 < column2, 'smaller', 'greater')
    

    结果曲目是ASCII因为两个字符串参数(第二个参数和第三个参数)都有ASCII曲目。第一个参数对于结果库无关紧要,即使表达式使用字符串值。