| 您的当前位置:首页 --> MYSQL教程 |
| MySQL乱码问题终极指南 |
| 浏览次数:785 关键词 ( ) |
|
mysql的字符集设置众多,从客户端到连接到结果集,从服务器到库到表到列,都可以设置字符集,灵活很强大,但就是很容易出问题,如果不了解其机制,很容易就出现乱码问题。 为了让大家尽量在工作中少受或者不受乱码的困扰,这里我结合之前其它同学在论坛的发帖,并结合自己的理解和实践,详细分析总结了一下,以飨各位看官。 关于字符集和乱码的基础知识这里就不详细说明了(请自行搜索),但有一个问题需要特别强调一下:乱码是怎么产生的? 1)数据传送过程中不会导致乱码 更详细的解释:转换导致乱码是指本来是A字符集的数据被当成了B字符集进行解析,而不是说正确的A字符集转换为B字符集。 如果character_set_connection 设置为gbk,mysql服务器收到数据后按照gbk解析,得到两个正确的中文,然后再转换为这两个中文对应的utf8编码,这就不会产生乱码。) 【mysql的字符处理机制】 详细的处理机制如下图:
我们模拟一下一条数据从插入到读取的处理流程,看看在整个流程中,字符集是如何辗转腾挪的。 【读取流程】 有了这个流程,我们就很容易定位乱码可能产生的地方,以及产生乱码的字符集配置究竟是哪个了。 有了上面的理论分析后,我们再结合一个乱码的抓包实例,加深理解,其中有一些问题,请大家思考一下,看看是否真的理解了。 环境: 测试语句是插入一个中文字符“你”,其utf8编码为"0xE4 0xBD 0xA0", 1. latin1发送包
思考一下1:为什么客户端和连接都设置了latin1,但最终发送的是正确的utf8编码呢? 2. latin1接收包
思考一下2:为什么接收到的还是正确的utf8编码? 3. latin1不显示乱码
思考一下3:为什么latin1显示了正确的utf8字符? 4. utf8接收包
思考一下4:为什么连接的字符集和数据库的字符集设置成一样了,接收的数据反而不是utf8了?(请与latin1接收数据包对比) 5. utf8显示包
思考一下5:为什么连接的字符集和数据库的字符集设置成一样了,显示反而乱码了? 怎么样,上面的思考题是否都有答案了,如果没有,相信下面这幅图能够帮助你: 这个抓包案例的字符变化图解:
附:mysql字符编码操作技巧 mysql> show variables like '%char%'; +--------------------------+-----------------------------------------------------+ | Variable_name | 说明 | +--------------------------+-----------------------------------------------------+ | character_set_client | 客户端字符集 | | character_set_connection | 当前连接字符集 | | character_set_database | 数据库字符集 | | character_set_filesystem | 文件系统字符集,不要修改,使用binary即可 | | character_set_results | 返回结果集字符集 | | character_set_server | 服务器默认字符集,当数据库、表、列没有设置时, | | | 默认使用此字符集 | | character_set_system | 固定为utf8 | +--------------------------+-----------------------------------------------------+ 【修改字符集设置】 【问题答案】 思考一下1:为什么客户端和连接都设置了latin1,但最终发送的是正确的utf8编码呢? 思考一下2:为什么接收到的还是正确的utf8编码? 思考一下3:为什么latin1显示了正确的utf8字符? 思考一下4:为什么连接的字符集和数据库的字符集设置成一样了,接收的数据反而不是utf8了?(请与latin1接收数据包对比) 思考一下5:为什么连接的字符集和数据库的字符集设置成一样了,显示反而乱码了? 以上就是关于MySQL乱码问题大集合,希望能够帮助大家解决MySQL乱码问题,谢谢大家的阅读。 |
| 下载次数:0 |
| 下载地址:点击下载 |
| 本资源为程序自动采集,如有侵权请联系我们移除 admin#80vps.com 来信请将#替换为@ |
| 下一条 SQL计算timestamp的差值的方法 上一条 Mysql启动的方式(四种) |