本章介绍MySQL处理不同字符集和语言的基础知识。
1 字符集和校对顺序
数据库表用来存储和检索数据。
不同的语言和字符集需要以不同的方式存储和检索。因此MySQL需要适应不同的字符集(不同的字母和字符),适用不同的排序和检索数据的方法。
在讨论多种语言和字符集时,将会遇到以下重要术语:
①字符集为字母和符号的集合;
②编码为某个字符集成员的内部表示;
③校队为规定字符如何比较的指令。
校队为什么重要?
排序英文正文很容易,对吗?这有赖于你是否想区分大小写。使用区分大小写的校对顺序,这些词有一种排序方式,使用不区分大小写的校对顺序有另外一种排序方式。
这不仅影响排序(如用order by排序数据),还影响搜索(例如,寻找apple的where子句是否能找到APPLE)
在使用法文或德文这样的字符时,情况更复杂,在使用不基于拉丁文的字符集时,情况更为复杂。
在MySQL的正常数据库活动(select,insert等),不需要操心太多的东西。使用何种字符集和校对的决定在服务器、数据库和表级进行。
2 使用字符集和校对顺序
MySQL支持众多的字符集。为查看所支持的字符集完整列表,使用以下语句:
show character set;
这条语句显示所有可用的字符集以及每个字符集的描述和默认校对。
为了查看所支持校对的完整列表,使用以下语句:
show collation;
collation是校对的意思。
此语句显示所有可用的校对,以及它们适用的字符集。可以看到有的字符集具有不止一种校对。例如,latin1对不同的欧洲语言有几种校对,而且许多校对出现两次,一次区分大小写(由_cs表示),一次不区分大小写(由_ci表示)。
通常系统管理在安装时定义一个默认的字符集和校对。也可以在创建数据库时,指定默认的字符集和校对。为了确定所用的字符集和校对,可以使用以下语句:
show variables like 'character%';
show variables like 'collation%';
实际上,字符集很少是服务器范围(甚至数据库范围)的设置。不同的表,甚至不同的列都可能需要不同的字符集,而且两者都可以在创建表时指定。
为了给表指定字符集和校对,可使用带子句的create table:
create table mytable
(
column1 int,
column2 varchar(10)
)default character set hebrew
collate hebrew_general_ci;
此语句创建一个包含两列的表,并且指定一个字符集和一个校对顺序。
这个例子中指定了character set和collate两者。
一般,MySQL如下确定使用什么样的字符集和校对:
①如果指定character set和collate两者,则使用这些值;
②如果只指定character set,则使用此字符集及其默认的校对(如show character set中的结果中所示)。
③如果既不指定character set,也不指定collate,则使用数据库默认。
除了能指定字符集和校对的表范围,MySQL还允许对每个列设置它们,如下所示:
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;
这里对整个表以及一个特定的列指定了character set和collate。
如前所述,校对在对用order by子句检索出来的数据排序时起重要的作用。如果你需要用与创建表时不同的校对顺序排序特定的select语句,可以在select语句自身中进行:
select * from customers
order by lastname,firstname collate latin1_general_cs;
此select使用collate指定一个备用的校对顺序(在这个例子中为了区分大小写的校对)。这显然将会影响到结果排序的次序。
临时区分大小写:上面的select语句演示了在通常不区分大小写的表上进行区分大小写搜索的一种技术。当然,反过来也是可以的。
select的其他collate子句:除了这里看到的在order by子句中使用以外,collate还可以用于group by,having,聚集函数,别名等。
最后,值得注意的是,如果绝对需要,串可以在字符集之间进行转换。为此可以使用Cast()或Convert()函数。
小结
本章中,我们学习了字符集和校对的基础知识,还学习了如何对特定的表和列定义字符集和校对,如何在需要时使用备用的校对。