• 字符集支持
    • Collation 命名规则
    • 集群 Character Set 和 Collation
    • 数据库 Character Set 和 Collation
    • 表的 Character Set 和 Collation
    • 列的 Character Set 和 Collation
    • 字符串 Character Sets 和 Collation
    • 客户端连接的 Character Sets 和 Collations
    • 集群,服务器,数据库,表,列,字符串 Character Sets 和 Collation 优化级
    • Character Sets 和 Collation 通用选择规则

    字符集支持

    名词解释,下面的阐述中会交错使用中文或者英文,请互相对照:

    • Character Set:字符集
    • Collation:排序规则

    目前 TiDB 支持以下字符集:

    1. mysql> SHOW CHARACTER SET;
    2. +---------|---------------|-------------------|--------+
    3. | Charset | Description | Default collation | Maxlen |
    4. +---------|---------------|-------------------|--------+
    5. | utf8 | UTF-8 Unicode | utf8_bin | 3 |
    6. | utf8mb4 | UTF-8 Unicode | utf8mb4_bin | 4 |
    7. | ascii | US ASCII | ascii_bin | 1 |
    8. | latin1 | Latin1 | latin1_bin | 1 |
    9. | binary | binary | binary | 1 |
    10. +---------|---------------|-------------------|--------+
    11. 5 rows in set (0.00 sec)

    注意:

    • TiDButf8 被当做成了 utf8mb4 来处理。
    • 每种字符集都对应一个默认的 Collation,当前有且仅有一个。

    对于字符集来说,至少会有一个 Collation(排序规则)与之对应。而大部分字符集实际上会有多个 Collation。利用以下的语句可以查看:

    1. mysql> SHOW COLLATION WHERE Charset = 'latin1';
    2. +-------------------|---------|------|---------|----------|---------+
    3. | Collation | Charset | Id | Default | Compiled | Sortlen |
    4. +-------------------|---------|------|---------|----------|---------+
    5. | latin1_german1_ci | latin1 | 5 | | Yes | 1 |
    6. | latin1_swedish_ci | latin1 | 8 | Yes | Yes | 1 |
    7. | latin1_danish_ci | latin1 | 15 | | Yes | 1 |
    8. | latin1_german2_ci | latin1 | 31 | | Yes | 1 |
    9. | latin1_bin | latin1 | 47 | | Yes | 1 |
    10. | latin1_general_ci | latin1 | 48 | | Yes | 1 |
    11. | latin1_general_cs | latin1 | 49 | | Yes | 1 |
    12. | latin1_spanish_ci | latin1 | 94 | | Yes | 1 |
    13. +-------------------|---------|------|---------|----------|---------+
    14. 8 rows in set (0.00 sec)

    latin1 Collation(排序规则)分别有以下含义:

    Collation 含义
    latin1_bin latin1 编码的二进制表示
    latin1_danish_ci 丹麦语/挪威语,不区分大小写
    latin1_general_ci 多种语言的 (西欧),不区分大小写
    latin1_general_cs 多种语言的 (ISO 西欧),区分大小写
    latin1_german1_ci 德国 DIN-1 (字典序),不区分大小写
    latin1_german2_ci 德国 DIN-2,不区分大小写
    latin1_spanish_ci 现代西班牙语,不区分大小写
    latin1_swedish_ci 瑞典语/芬兰语,不区分大小写

    每一个字符集,都有一个默认的 Collation,例如 utf8 的默认 Collation 就为 utf8_bin

    注意:

    TiDB 目前的 Collation 只支持区分大小写的比较排序规则。

    Collation 命名规则

    TiDB 的 Collation 遵循着如下的命名规则:

    • Collation 的前缀是它相应的字符集,通常之后会跟着一个或者更多的后缀来表名其他的排序规则, 例如:utf8_general_ci 和 lation1_swedish_ci 是 utf8 和 latin1 字符集的 Collation。但是 binary 字符集只有一个 Collation,就是 binary。
    • 一个语言对应的 Collation 会包含语言的名字,例如 utf8_turkish_ci 和 utf8_hungarian_ci 是依据 Turkish(土耳其语) 和 Hungarian(匈牙利语) 的排序规则来排序。
    • Collation 的后缀表示了 Collation 是否区分大小写和是否区分口音。下面的表展示了这些特性:
    后缀 含义
    _ai 口音不敏感(Accent insensitive)
    _as 口音敏感 (Accent sensitive)
    _ci 大小写不敏感
    _cs 大小写敏感

    注意:

    目前为止 TiDB 只支持部分以上提到的 Collation。

    集群 Character Set 和 Collation

    暂不支持

    数据库 Character Set 和 Collation

    每个数据库都有相应的 Character Set 和 Collation,数据库的 Character Set 和 Collation 可以通过以下语句来设置:

    1. CREATE DATABASE db_name
    2. [[DEFAULT] CHARACTER SET charset_name]
    3. [[DEFAULT] COLLATE collation_name]
    4. ALTER DATABASE db_name
    5. [[DEFAULT] CHARACTER SET charset_name]
    6. [[DEFAULT] COLLATE collation_name]

    在这里 DATABASE 可以跟 SCHEMA 互换使用。

    不同的数据库之间可以使用不一样的字符集和排序规则。

    通过系统变量 character_set_databasecollation_database 可以查看到当前数据库的字符集以及排序规则:

    1. mysql> create schema test1 character set utf8 COLLATE uft8_general_ci;
    2. Query OK, 0 rows affected (0.09 sec)
    3. mysql> use test1;
    4. Database changed
    5. mysql> SELECT @@character_set_database, @@collation_database;
    6. +--------------------------|----------------------+
    7. | @@character_set_database | @@collation_database |
    8. +--------------------------|----------------------+
    9. | utf8 | uft8_general_ci |
    10. +--------------------------|----------------------+
    11. 1 row in set (0.00 sec)
    12. mysql> create schema test2 character set latin1 COLLATE latin1_general_ci;
    13. Query OK, 0 rows affected (0.09 sec)
    14. mysql> use test2;
    15. Database changed
    16. mysql> SELECT @@character_set_database, @@collation_database;
    17. +--------------------------|----------------------+
    18. | @@character_set_database | @@collation_database |
    19. +--------------------------|----------------------+
    20. | latin1 | latin1_general_ci |
    21. +--------------------------|----------------------+
    22. 1 row in set (0.00 sec)

    在 INFORMATION_SCHEMA 中也可以查看到这两个值:

    1. SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
    2. FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db_name';

    表的 Character Set 和 Collation

    表的 Character Set 和 Collation 可以通过以下语句来设置:

    1. CREATE TABLE tbl_name (column_list)
    2. [[DEFAULT] CHARACTER SET charset_name]
    3. [COLLATE collation_name]]
    4. ALTER TABLE tbl_name
    5. [[DEFAULT] CHARACTER SET charset_name]
    6. [COLLATE collation_name]

    例如:

    1. mysql> CREATE TABLE t1(a int) CHARACTER SET utf8 COLLATE utf8_general_ci;
    2. Query OK, 0 rows affected (0.08 sec)

    如果表的字符集和排序规则没有设置,那么数据库的字符集和排序规则就作为其默认值。

    列的 Character Set 和 Collation

    列的 Character Set 和 Collation 的语法如下:

    1. col_name {CHAR | VARCHAR | TEXT} (col_length)
    2. [CHARACTER SET charset_name]
    3. [COLLATE collation_name]
    4. col_name {ENUM | SET} (val_list)
    5. [CHARACTER SET charset_name]
    6. [COLLATE collation_name]

    如果列的字符集和排序规则没有设置,那么表的字符集和排序规则就作为其默认值。

    字符串 Character Sets 和 Collation

    每一字符串字符文字有一个字符集和一个比较排序规则,在使用字符串时指,此选项可选,如下:

    1. [_charset_name]'string' [COLLATE collation_name]

    示例,如下:

    1. SELECT 'string';
    2. SELECT _latin1'string';
    3. SELECT _latin1'string' COLLATE latin1_danish_ci;

    规则,如下:

    • 规则1: 指定 CHARACTER SET charset_name 和 COLLATE collation_name,则直接使用 CHARACTER SET charset_name 和COLLATE collation_name。
    • 规则2: 指定 CHARACTER SET charset_name 且未指定 COLLATE collation_name,则使用 CHARACTER SET charset_name 和 CHARACTER SET charset_name 默认的排序比较规则。
    • 规则3: CHARACTER SET charset_name 和 COLLATE collation_name 都未指定,则使用 character_set_connection 和 collation_connection 系统变量给出的字符集和比较排序规则。

    客户端连接的 Character Sets 和 Collations

    • 服务器的字符集和排序规则可以通过系统变量 character_set_servercollation_server 获取。
    • 数据库的字符集和排序规则可以通过环境变量 character_set_databasecollation_database 获取。

    对于每一个客户端的连接,也有相应的变量表示字符集和排序规则:character_set_connectioncollation_connection

    character_set_client 代表客户端的字符集。在返回结果前,服务端会把结果根据 character_set_results 转换成对应的字符集。包括结果的元信息等。

    可以用以下的语句来影响这些跟客户端相关的字符集变量:

    • SET NAMES 'charset_name' [COLLATE 'collation_name']

    SET NAMES 用来设定客户端会在之后的请求中使用的字符集。SET NAMES utf8 表示客户端会在接下来的请求中,都使用 utf8 字符集。服务端也会在之后返回结果的时候使用 utf8 字符集。 SET NAMES 'charset_name' 语句其实等于下面语句的组合:

    1. SET character_set_client = charset_name;
    2. SET character_set_results = charset_name;
    3. SET character_set_connection = charset_name;

    COLLATE 是可选的,如果没有提供,将会用 charset_name 默认的 Collation。

    • SET CHARACTER SET 'charset_name'

    SET NAMES 类似,等价于下面语句的组合:

    1. SET character_set_client = charset_name;
    2. SET character_set_results = charset_name;
    3. SET collation_connection = @@collation_database;

    集群,服务器,数据库,表,列,字符串 Character Sets 和 Collation 优化级

    字符串 => 列 => 表 => 数据库 => 服务器 => 集群

    Character Sets 和 Collation 通用选择规则

    • 规则1: 指定 CHARACTER SET charset_name 和 COLLATE collation_name,则直接使用 CHARACTER SET charset_name 和COLLATE collation_name。
    • 规则2: 指定 CHARACTER SET charset_name 且未指定 COLLATE collation_name,则使用 CHARACTER SET charset_name 和 CHARACTER SET charset_name 默认的排序比较规则。
    • 规则3: CHARACTER SET charset_name 和 COLLATE collation_name 都未指定,则使用更高优化级给出的字符集和排序比较规则。

    更多细节,参考 Connection Character Sets and Collations。