深入理解MySQL字符集设置

字符集(Character set)和校对(Collation)
每种字符集都可能有多种校对规则,并且有一个默认的校对规则。
remember:只有基于字符的值才真正的“有”字符集的概念,对于其他类型的值,字符集只是一种设置,指定用哪一种字符集来做比较或者其他操作。

ps:可以使用前缀和COLLATE来指定字符串的字符集或者校对字符集

这里写图片描述

校对规则

_cs(大小写敏感)
_ci(大小写不明感)
_bin(字符串编码的二进制值)

MySQL的设置

  • 创建对象时的默认值
    • 创建数据库的时候,将根据服务器上的character_set_server设置来设定该数据库的默认字符集
    • 创建表的时候,将根据数据库的字符集设置指定表的字符集设置
    • 创建列的时候,讲根据表的设置指定列的字符集设置
  • 在服务器和客户端通信时的设置
    • 服务器总是假设假设客户端是按照character_set_client设置的字符来传输数据和SQL的
    • 当服务器收到客户端的SQL语句时,它先将其转换成字符集character_set_connection。它还使用这个设置来决定如何将数据转换成字符串
    • 当服务端返回数据或者错误信息给客户端时,它回将其转换成character_set_result

我们在实际编码中在执行sql之前往往会先加上一句”set names utf8”,那么这到底影响了些啥呢?
先执行
show variables like ‘character_set%’
这里写图片描述
然后执行
set names latin1

show variables like ‘character_set%’

这里写图片描述
没错影响的正是 character_set_client character_set_connection character_set_results

注意: set names utf8只是影响这次会话的环境变量。

MySQL字符集的一些建议

  • 建立数据库/表和进行数据库操作时尽量显式指出使用的字符集,而不是依赖于MySQL的默认设置,否则MySQL升级时可能带来很大困扰;
  • 字符集设置为utf8“整个世界都清净了”

补充

数据库报Incorrect String value \xF0\x9F\x98\x98
google之发现是由于mysql的utf8最多只支持3个字节,如果想插入更多最好是utf8mb4(most bytes 4)

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值