字符集(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)
参考资料
- 《高性能MySQL》7.9节(291~299)
- MySQL内核月报
- utf8 utf8mb4区别
- utf8mb4校对规则