字符集和校对
目录
字符集和校对
字符集:一种从二进制编码到某类字符符号的映射,例如:如何使用一个字节来表示英文字符。
校对:一组用于某个字符集的排序规则。
Mysql对字符集的设置可以分为两类:创建对象时的默认值、在服务器和客户端通信时的设置。
创建对象时的默认值
创建数据库的时候,将根据服务器上的character_set_server设置来设定该数据库的默认字符集;
创建表的时候,将根据数据库的字符集设置指定这个表的字符设置;
创建列的时候,将根据表的设置指定列的字符集设置。
重点:真正存放数据的是列,只有当创建罗列而没有为列指定字符集的时候,表的默认字符集才有作用。
在服务器和客户端通信时的设置
服务器可以使用set names 或者set character set 语句来改变下面的设置。(只对服务器有效)
mysql如何选择字符集和校对规则
用户设置 | 返回结果的字符集 | 返回结果的校对规则 |
---|---|---|
同时设置字符集和校对规则 | 与用户设置相同 | 与用户设置相同 |
仅设置字符集 | 与用户设置相同 | 与字符集的默认校对规则相同 |
近设置校对规则 | 与校对规则对应的字符集相同 | 与用户设置相同 |
都未设置 | 使用默认值 | 使用默认值 |
可以用show character set 和 show collation 来查看mysql支持的字符集和校对规则。
示例
下例为使用了前缀来指定utf8字符集,还使用了collate子句来指定了使用二进制校对规则:
mysql> select _utf8 'hello world' collate utf8_bin;
+--------------------------------------+
| _utf8 'hello world' collate utf8_bin |
+--------------------------------------+
| hello world |
+--------------------------------------+
1 row in set
创建库、表、列时如何限制地指定字符集和校对规则:
create database d charset latin1;
create table d.t(
col1 char(1),
col2 char(1) charset utf8,
col3 char(1) collate latin1_bin
) default charset=cp1251;
下面sql为展示列的字符集和校对规则:
show full columns from d.t;
影响查询
某些字符集和校对规则可能会需要更多的cpu操作,可能会消耗更多的内存和存储空间,影响索引的正常使用。
order by查询
explain select title, release_year from sakila.film order by title;
只有排序查询要求的字符集与服务器数据的字符集相同的时候,才能使用索引进行排序。索引根据数据列的校对规则进行排序,上面语句是utf8_general_ci, 现改变校对规则,会变成文件排序:
explain select title, release_year from sakila.film order by title collate utf8_bin;
多字节编码
utf-8是一种多字节编码,它存储一个字符会使用变长的字节数(一到三个字节)。
例如,一个编码是utf-8的char(10) 存储十个汉字需要30个字符。
mysql中有两个行数length() 和char_length() 来计算字符串的长度,在多字节字符集中,这两个函数的返回结果会不同。
一个表的某个列的配置:`real_name` varchar(30) NOT NULL
字符:单位(个数) | char_length(real_name) | length(real_name) |
当存储三十个汉字 | 30 | 90 |
当存储三十个字母 | 30 | 30 |
当存储三十个数字 | 30 | 30 |