MySQL的字符集

1.MySQL的utfmb3 与 utf8mb4区别

utf8是utfmb3的别名

utf8 字符集表示一个字符需要使用1~4个字节,但是我们常用的一些字符使用1~3个字节就可以表示了。而字符集表示一个字符所用的最大字节长度,在某些方面会影响系统的存储和性能。

MySQL的设计者偷偷的定义了两个概念:

  • utf8mb3 :阉割过的 utf8 字符集,只使用1~3个字节表示字符。
  • utf8mb4 :正宗的 utf8 字符集,使用1~4个字节表示字符。

在utf8mb4下,英文占1个字符,中文3个,特殊符号4个.
所以为例数据库有更好的兼容性,用mb4,但是会浪费点空间

2.Mysql字符集查看

MySQL字符集默认是utfmb4
通过一下命令可以查看所有支持的字符集在这里插入图片描述

以下展示常用字符集已经分别是几个字节表示一个字符
在这里插入图片描述

3.比较

在这里插入图片描述
命令可以查看所有的比较规则
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.客户端和服务器的字符集

客户端和服务器会有一个实现约定好的数据格式成为MySQL通信协议

客户端发送请求是什么字符集?

根据客户端当前系统的字符集而定。这种指定是映射关系的,有映射的就按照映射,没有的就按照客户端的默认字符集。
在这里插入图片描述

  • 类UNIX系统
    由三个指定字符集的系统变量来指定当前系统是什么字符集
  • Windows系统
    不同情况下字符集可能不同,例如命令行情况下字符集是GBK

在Windows情况下可以在期待客户端的时候指定字符集来发送请求
在这里插入图片描述

服务器接收请求用的什么字符集?

服务器会按照character_set_client变量(默认是客户端的字符集)指定的字符集来编码收到的请求字节码序列。
服务区会对每一个客户端维护一个单独的character_set_client变量,这个变量是session级别的。

如果客户端发送的字符集和服务器接收的字符集不同?

如果客户端的字符集是UTF-8,服务器使用SET命令修改了character_set_client变量,那么服务区就无法进行编码。会发生

  • 查询出的数据无法正确编码展示
  • 告警
    在这里插入图片描述

服务器处理请求的字符集

服务区接收使用的字符集是character_set_client,但是真正处理请求的字符集是character_set_connection。会在处理请求的时候进行转换。虽然他们俩在客户端连接上服务器之后都会默认初始化为客户端的默认字符集

既然是一样的character_set_connection的作用是什么?

character_set_connection有一个配套的collation_connection。collation_connection是指定用于比较的规则。

  • 当值与值比较时,有用:比如当比较'a' = 'A'时,是否相等,主要就是取决于collation_connection指定的比较规则。
  • 但是当和列比较时就没用了,比如:where c='我',如果列c和character_set_connection的字符集不同(此处collation_connection为对应character_set_connection的字符集的比较规则),则会把要比较的字符集我从character_set_connection字符集转为列C的字符集再进行比较

服务器生成相应的字符集

是由 character_set_results指定

总结一下上面的三个变量

在这里插入图片描述
注意:这三个都是客户端建立连接后初始化为客户端默认字符集的session级别的变量

客户端接收响应的字符集

  • UNIX:使用操作系统字符集接收
  • Windows:使用默认客户端字符集接收
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值