字符集和校对

                              字符集和校对

目录

字符集和校对

创建对象时的默认值

在服务器和客户端通信时的设置

mysql如何选择字符集和校对规则:

示例

影响查询

多字节编码


字符集和校对

字符集:一种从二进制编码到某类字符符号的映射,例如:如何使用一个字节来表示英文字符。
校对:一组用于某个字符集的排序规则。

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)
当存储三十个汉字3090
当存储三十个字母3030
当存储三十个数字3030


 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值