二十七、全球化和本地化
01. 字符集和校对顺序
数据库表被用来存储和检索数据。不同的语言和字符集需要以不同的方式存储和检索。因此,MySQL需要适应不同的字符集(不同的字母和字符),适应不同的排序和检索数据的方法。
在讨论多种语言和字符集时,将会遇到以下重要术语:
- 字符集: 字母和符号的集合;
- 编码: 某个字符集成员的内部表示;
- 校对: 规定字符如何比较的指令。
校对为什么重要: 排序英文正文很容易,对吗?或许不。考虑词APE、apex和Apple。它们处于正确的排序顺序吗?
- 这有赖于你是否想区分大小写。使用区分大小写的校对顺序,这些词有一种排序方式,使用不区分大小写的校对顺序有另外一种排序方式;
- 这不仅影响排序(如用ORDER BY排序数据),还影响搜索(例如,寻找apple 的WHERE子句是否能找到APPLE);
- 在使用诸如法文à或德文ö这样的字符时,情况更复杂,在使用不基于拉丁文的字符集(日文、希伯来文、俄文等)时,情况更为复杂。
在MySQL的正常数据库活动(SELECT、INSERT等)中,不需要操心太多的东西;使用何种字符集和校对的决定在服务器、数据库和表级进行。
02. 使用字符集和校对顺序
MySQL支持众多的字符集,为查看所支持的字符集完整列表,使用以下语句:
- 显示所有可用的字符集以及每个字符集的描述和默认校对;
- 查看所支持校对的完整列表:
显示所有可用的校对,以及它们适用的字符集; - 通常系统管理在安装时定义一个默认的字符集和校对,此外,也可以在创建数据库时,指定默认的字符集和校对;
- 为了确定所用的字符集和校对,可以使用以下语句:
- 给表指定字符集和校对,可使用带子句的CREATE TABLE:
- 一般,MySQL如下确定使用什么样的字符集和校对:
6.1 如果指定CHARACTER SET和COLLATE两者,则使用这些值;
6.2 如果只指定CHARACTER SET,则使用此字符集及其默认的校对;
6.3 如果既不指定CHARACTER SET,也不指定COLLATE,则使用数据库默认; - 除了能指定字符集和校对的表范围外,MySQL还允许对每个列设置它们:
这里对整个表以及一个特定的列指定了CHARACTER SET和COLLATE; - 校对在对用ORDER BY子句检索出来的数据排序时起重要的作用,如果你需要用与创建表时不同的校对顺序排序特定的SELECT语句,可以在SELECT语句自身中进行:
此SELECT使用COLLATE指定一个备用的校对顺序。
临时区分大小写: 上面的SELECT语句演示了在通常不区分大小写的表上进行区分大小写搜索的一种技术。当然,反过来也是可以的。
SELECT的其他COLLATE子句: 除了这里看到的在ORDER BY子句中使用以外,COLLATE还可以用于GROUP BY、HAVING、聚集函数、别名等。
值得注意的是,如果绝对需要,串可以在字符集之间进行转换。为此,使用Cast()或Convert()函数。