目录
字符集和校对
创建对象时的默认值
在服务器和客户端通信时的设置
mysql如何选择字符集和校对规则:
示例
影响查询
多字节编码
字符集:一种从二进制编码到某类字符符号的映射,例如:如何使用一个字节来表示英文字符。 校对:一组用于某个字符集的排序规则。 Mysql对字符集的设置可以分为两类:创建对象时的默认值、在服务器和客户端通信时的设置。
创建数据库的时候,将根据服务器上的character_set_server设置来设定该数据库的默认字符集; 创建表的时候,将根据数据库的字符集设置指定这个表的字符设置; 创建列的时候,将根据表的设置指定列的字符集设置。 重点:真正存放数据的是列,只有当创建罗列而没有为列指定字符集的时候,表的默认字符集才有作用。
服务器可以使用set names 或者set character set 语句来改变下面的设置。(只对服务器有效)
用户设置返回结果的字符集返回结果的校对规则同时设置字符集和校对规则与用户设置相同与用户设置相同仅设置字符集与用户设置相同与字符集的默认校对规则相同近设置校对规则与校对规则对应的字符集相同与用户设置相同都未设置使用默认值使用默认值
可以用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)当存储三十个汉字3090当存储三十个字母3030当存储三十个数字3030
