深入理解MySQL字符集设置

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

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

《深入理解MySQL字符集设置》

校对规则

_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%’
《深入理解MySQL字符集设置》
然后执行
set names latin1

show variables like ‘character_set%’

《深入理解MySQL字符集设置》
没错影响的正是 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)

参考资料

  • 《高性能MySQL》7.9节(291~299)
  • MySQL内核月报
  • utf8 utf8mb4区别
  • utf8mb4校对规则
    原文作者:mysql
    原文地址: https://blog.csdn.net/qianxc88/article/details/46671059
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞