对于字符串类型,有一个字符集的概念在里面。字符集是指,一种从二进制编码到某类字符符号的映射。例如,中文符号,在计算机底层用二进制存储,那么,就需要有一个映射表,来表示哪个中文符号用哪个二进制编码来表示。校对,是指一组用于某个字符集的排序规则。
1 mysql如何使用字符集
只有基于字符的值才有字符集的概念。因此,对于其他类型的值,比如,int,datetime,是不需要使用到字符集来编码的。
mysql的字符集的设置可以分为两类:创建对象时的默认值、服务器和客户端通信所使用的字符集设置
1.1 创建对象时的字符集设置
mysql服务器有默认的字符集和校对规则,每个数据库也有自己的默认值,每个表也有自己的默认值。这是一个逐层继承的默认设置。例如,如果数据库的默认字符集为utf8mb4,在创建表my_table时没有指定字符集,那么,my_table的字符集将是utf8mb4。如果有指定为utf8,那么,就是指定的字符集utf8。记住:只有当用户没有指定字符集时,默认字符集才起作用。
在创建数据库、表和列时,都可以由用户自己指定字符集。
1.2 服务器和客户端通信所使用的字符集设置
服务器和客户端通信时,可能使用不同的字符集。因此,服务器必须进行“翻译”的工作:
- 服务器假设客户端使用character_set_client来传输数据和sql语句;
- 服务器收到sql语句后,将character_set_client编码的语句转化为character_set_connection编码的语句。在处理sql语句时,都使用character_set_connection。
- 在服务器返回结果给客户端时,将character_set_connection转化为character_set_result。
因此,若客户端连接到服务器时使用latin1字符集,服务器假设客户端使用utf8字符集,那么,这时候可能导致转化的时候出现一些错误。
2 怎样选择字符集和校对规则
在设置字符集时,最好先为服务器(或者数据库)设置一个合理的字符集。然后,根据实际情况,选择列的字符集。在一个数据库中使用不同的字符集是一件麻烦的事情,所以,一个数据库中使用一种字符集比较好。
对于校对规则,需要考虑到:
- 是否大小写敏感
- 是否以字符串编码的二进制来比较大小。
大小写敏感、大小写不敏感和以二进制值比较大小的校对规则的后缀分别是:_cs、_ci和_bin。如果不指定校对规则,则会以字符集默认的校对规则来比较大小。
3 字符集和校对规则如何影响查询
只有排序查询要求的字符集与服务器数据的字符集相同的时候,才能使用索引进行排序。因为,索引是根据数据列的校对规则进行排序的。例如,若列使用的是utf8_general_ci,查询排序时指定utf8_bin,那么,就没法使用索引来排序了。这个时候,需要文件排序。
标签:set,character,字符集,mysql,校对,服务器,客户端 From: https://www.cnblogs.com/phenixlife/p/17416592.html