您的位置:首页 > 数据库 > MySQL

深入理解MySQL字符集设置

2015-06-28 13:52 525 查看
字符集(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校对规则
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MySQL 字符集 乱码