字符集和校对顺序

  • 不同的语言和字符集需要以不同的方式存储和检索。

    MySQL需要适应不同的字符集(不同的字母和字符),适应不同的排序和检索数据的方法。

  • 字符集为字母和符号的集合。

  • 编码为某个字符集成员的内部表示。

  • 校对为规定字符如何比较的指令。

  • 校对为什么重要?

    使用区分大小写的校对顺序,有一种排序方式;使用不区分大小写的校对顺序有另一种排序方式。

    这不仅影响排序(如用ORDER BY排序数据),还影响搜索(例如,寻找apple的WHERE子句是否能找到APPLE)。在使用法文或德文的字符时,情况更复杂,在使用不基于拉丁文的字符集(日文、希伯来文、俄文等)时,情况更为复杂。

  • 在MySQL的正常数据活动(SELECTINSERT等)中,不需要操心太多的东西。

    使用何种字符集和校对的决定在服务器、数据库和表级进行。

使用字符集和校对顺序

  • MySQL支持众多的字符集。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 查看所支持的字符集完整列表
SHOW CHARACTER SET;

/*
此语句显示所有可用的字符集以及每个字符集的描述和默认校对。
*/

-- 查看所支持校对的完整列表
SHOW COLLATION;

/*
显示所有可用的校对,以及它们适用的字符集。可以看到有的字符集具有不止一种校对。
例如,latin1对不同的欧洲语言有几种校对,而且许多校对出现两次,
一次区分大小写(由_cs表示),一次不区分大小写(由_ci表示)。
*/
  • 通常系统管理在安装时定义一个默认的字符集和校对。也可以在创建数据库时,指定默认的字符集和校对。
1
2
3
-- 确定所用的字符集和校对
SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation%';
  • 实际上,字符集很少是服务器范围(甚至是数据库范围)的设置。

    不同的表,甚至不同的列都可能需要不同的字符集,而且两者都可以在创建表时指定。

1
2
3
4
5
6
7
8
9
10
11
-- 给表指定字符集和校对
CREATE TABLE mytable
(
column1 INT,
column2 VARCHAR(10)
) DEFAULT CHARACTER SET hebrew
COLLATE hebrew_general_ci;

/*
此语句创建一个包含两列的表,并且指定一个字符集和一个校对顺序。
*/
  • 一般,MySQL如下确定使用什么样的字符集和校对:
    1. 如果指定CHARACTER SETCOLLATE两者,则使用这些值。
    2. 如果只指定CHARACTER SET,则使用此字符集及其默认的校对(如SHOW CHARACTER SET的结果中所示)。
    3. 如果既不指定CHARACTER SET,也不指定COLLATE,则使用数据库默认。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 对整个表以及一个特定的列指定CHARACTER SET和COLLATE
CREATE TABLE mytable
(
column1 INT,
column2 VARCHAR(10),
column3 VARCHAR(10) CHARACTER SET latin1 COLLATE latin1_general_ci
) DEFAULT CHARACTER SET hebrew
COLLATE hebrew_general_ci;

-- 用与创建表时不同的校对顺序排序特定的SELECT语句
SELECT * FROM customers
ORDER BY lastname, firstname COLLATE latin1_general_cs;

/*
此SELECT使用COLLATE指定一个备用的校对顺序,在这个例子中,为区分大小写的校对。
*/
  • 临时区分大小写:上面的SELECT语句演示了在通常不区分大小写的表上进行区分大小写搜索的一种技术。反过来也可以。
  • SELECT的其他COLLATE子句:除了这里在ORDER BY子句中使用以外,COLLATE还可以用于GROUP BYHAVING、聚集函数、别名等。
  • 如果绝对需要,串可以在字符集之间进行转换。为此,使用Cast()Convert()函数。