MySQL:46---字符集和校对顺序(character、collate)

一、字符集和校对顺序

  • 数据库表被用来存储和检索数据。不同的语言和字符集需要以不同的方式存储和检索。因此,MySQL需要适应不同的字符集(不同的字母和字符),适应不同的排序和检索数据的方法
  • 在MySQL的正常数据库活动(select、insert等)中,不需要操心太多的东西。使用何种字符集和校对的决定在服务器、数据库和表级进行

几个重要术语

  • 字符集:为字母和符号的集合
  • 编码:为某个字符集成员的内部表示
  • 校对:为规定字符如何比较的指令

为什么校对这么重要

  • 排序英文其实没有想象的那么简单。考虑APE、apex和Apple,它们处于正确的排列顺序吗?这依赖于你是否想区分大小写。使用区分大小写的校对顺序,这些词有一种排序方式,使用不区分大小写的校对顺序。这不仅影响排序(如用order by排序数据),还影响搜索(例如,寻找apple的where子句是否能找到APPLE)
  • 在使用诸如发文或德文这样的特殊字符时,情况更复杂,在使用不基于拉丁文的字符集(日文、希伯来文、俄文等)时,情况更复杂

二、查看所支持的字符集列表

  • MySQL支持众多的字符集。可以使用下面的语句查看所支持的字符集完整列表,这条语句显示所有可用的字符集以及每个字符集的描述和默认校对
show character set;
  • 可以看到有的字符集具有不止一种校对

MySQL:46---字符集和校对顺序(character、collate)_第1张图片

三、查看所支持的校对列表

  • 以下语句可以查看所支持的所有校对
show collation;
  • 例如,latin1对不同的欧洲语言有几种校对,而且许多校对出现两次,一次区分大小写(由_cs表示),一次不区分大小写(由_ci表示)(下图截图不完整)

MySQL:46---字符集和校对顺序(character、collate)_第2张图片

四、查看默认的字符集和校对

  • 数据库在安装时有一个默认的字符集和校对。此外,也可以在创建数据库时指定默认的字符集和校对
  • 事实上,字符集很少是服务器范围(甚至数据库范围)的设置。不同的表,甚至不同的列都可能需要不同的字符集,而且两者可以在创建表时指定
  • 可以使用下面的语句分别来查看默认的字符集和校对
show variables like 'character%';

show variables like 'collation%';

MySQL:46---字符集和校对顺序(character、collate)_第3张图片

五、创建表时指定字符集和校对

  • 例如下面是在创建表时给表指定字符集和校对(当然,可以根据需要只设置字符集/校对其中一项):
create table mytable
(
    column1 int,
    column2 varchar(10)
)default character set hebrew collate hebrew_general_ci;

六、给每个列设置字符集和校对

  • 例如下面给column3字段设置默认的字符集和校对(当然,可以根据需要只设置字符集/校对其中一项)
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语句使用collate指定一个备用的校对顺序(在这个例子中,为区分大小写的校对),这将会影响到结果排列的次序
select * from customers order by cust_name collate latin1_general_cs;

临时区分大小写

  • 上面的select语句演示了在通常不分区大小写的表上进行区分大小写搜索的一种技术。当然,反过来也是可以的

select的其它collate子句

  • 除了上面看到的在order by子句中使用以下,collate还可以用于group by、having、聚集函数、别名等
  • 最后,需要注意的是,如果绝对需要,串可以在字符集之间进行转换。为此,使用cast()或convert()函数

你可能感兴趣的:(MySQL)