《mysql高性能》系列4:字符集和校对

发布时间 2023-05-19 23:33:42作者: 涅槃的凤凰

对于字符串类型,有一个字符集的概念在里面。字符集是指,一种从二进制编码到某类字符符号的映射。例如,中文符号,在计算机底层用二进制存储,那么,就需要有一个映射表,来表示哪个中文符号用哪个二进制编码来表示。校对,是指一组用于某个字符集的排序规则。

1 mysql如何使用字符集

只有基于字符的值才有字符集的概念。因此,对于其他类型的值,比如,int,datetime,是不需要使用到字符集来编码的。
mysql的字符集的设置可以分为两类:创建对象时的默认值、服务器和客户端通信所使用的字符集设置

1.1 创建对象时的字符集设置

mysql服务器有默认的字符集和校对规则,每个数据库也有自己的默认值,每个表也有自己的默认值。这是一个逐层继承的默认设置。例如,如果数据库的默认字符集为utf8mb4,在创建表my_table时没有指定字符集,那么,my_table的字符集将是utf8mb4。如果有指定为utf8,那么,就是指定的字符集utf8。记住:只有当用户没有指定字符集时,默认字符集才起作用。

在创建数据库、表和列时,都可以由用户自己指定字符集。

1.2 服务器和客户端通信所使用的字符集设置

服务器和客户端通信时,可能使用不同的字符集。因此,服务器必须进行“翻译”的工作:

  1. 服务器假设客户端使用character_set_client来传输数据和sql语句;
  2. 服务器收到sql语句后,将character_set_client编码的语句转化为character_set_connection编码的语句。在处理sql语句时,都使用character_set_connection。
  3. 在服务器返回结果给客户端时,将character_set_connection转化为character_set_result。

因此,若客户端连接到服务器时使用latin1字符集,服务器假设客户端使用utf8字符集,那么,这时候可能导致转化的时候出现一些错误。

2 怎样选择字符集和校对规则

在设置字符集时,最好先为服务器(或者数据库)设置一个合理的字符集。然后,根据实际情况,选择列的字符集。在一个数据库中使用不同的字符集是一件麻烦的事情,所以,一个数据库中使用一种字符集比较好。

对于校对规则,需要考虑到:

  • 是否大小写敏感
  • 是否以字符串编码的二进制来比较大小。

大小写敏感、大小写不敏感和以二进制值比较大小的校对规则的后缀分别是:_cs、_ci和_bin。如果不指定校对规则,则会以字符集默认的校对规则来比较大小。

3 字符集和校对规则如何影响查询

只有排序查询要求的字符集与服务器数据的字符集相同的时候,才能使用索引进行排序。因为,索引是根据数据列的校对规则进行排序的。例如,若列使用的是utf8_general_ci,查询排序时指定utf8_bin,那么,就没法使用索引来排序了。这个时候,需要文件排序。