MySQL字符集

字符集和校对

字符集是指一种从二进制编码到某类字符符号的映射,可以参考如何使用一个字节来表示英文字母。“校对”是指一组用于某个字符集的排序规则。MySQL4.1和之后的版本中,每一类编码字符都有其对应的字符集和校对规则。MySQL对各种字符集的支持非常完善,但是这也带来了一定的复杂性,某些场景下甚至会有一定的性能牺牲。

MySQL如何使用字符集

每种字符集都可能有多种校对规则,并且都有一个默认的校对规则。每个校对规则都是针对某个特定的字符集,和其他的字符集没有关系。校对规则和字符集总是一起使用的,所以后面我们将这样的组合也统称为一个字符集。

  • MySQL的设置可以分为两类:创建对象时的默认值、在服务器和客户端通信时的设置
创建对象时的默认设置
  • 创建数据库的时候,将根据服务器上的character_set_server设置来设定该数据库的默认字符集
  • 创建表的时候,可以指定
  • 创建列的时候,可以指定
  • 默认字符集是继承关系,如果没有设置则按上一级的设置为准
服务器和客户端通信时的设置

当服务器和客户端通信的时候,它们可能使用不同的字符集。这时,服务器端将进行必要的翻译转换工作:

  • 服务器总是假设客户端是按照character_set_client设置的字符来传输数据和SQL语句的
  • 当服务器收到客户端的SQL语句时,它先将其转换成字符集character_set_connection。它还使用这个设置来决定如何将数据转换成字符串。
  • 当服务器返回数据或者错误信息给客户端时,它会将其转换成character_set_result
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tBmdLJR6-1609929522413)(4595BD2C99B14E2EB32EF42025649974)]
MySQL如何比较两个字符串的大小

如果比较的两个字符串的字符集不同,MySQL会先将其转成同一个字符集再进行比较,如果两个字符集不兼容的话,则会抛出错误,例如“ERROR 1267(HY000):Illegal mix of collations” 这种情况下需要通过函数CONVERT()显式地将其中一个字符串的字符集转成一个兼容的字符集。

  • 使用_uft8指定字符集,使用COLLATE指定校对规则
select _utf8 'hello' COLLATE  utf8_bin
查看命令
  • show collation; 数据库支持的校对规则
  • show characterset; 查看支持的字符集
  • show full columns from t2; 查看表列以及设置的字符集和校对规则
字符集和校对规则如何影响查询
  • 某些字符集和校对规则可能会需要更多的CPU操作
  • 可能会消耗更多的内存和存储空间
  • 影响索引的使用
  • 排序查询,oder by title collate uft8_bin 和title的校对规则不一致,会导致索引失效
  • UTF-8是一种多字节编码,它存储一个字符会使用变长的字节数(一到三个字节)。
    • MySQL内部,通常使用一个定长的空间来存储字符串,再进行相关操作,这样做的目的是希望总是保证缓存中有足够的空间来存储字符串。
    • 当它在存储在临时表中用来处理或者排序时,总是会分配最大可能的长度
    • 索引超过999字节会自动缩短到333个字符,变成前缀索引。
    • 使用英文占用一个字节,使用中文占用三个字节。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值