设为首页 收藏本站
查看: 471|回复: 0

[经验分享] MySQL对字符集的支持及对乱码出现原因【转】

[复制链接]

尚未签到

发表于 2016-10-23 04:20:07 | 显示全部楼层 |阅读模式
  MySQL 4.1后对字符集支持的高度灵活性着实给包括我在内的许多人带来了不小的麻烦。百度和Google中搜索MySQL 乱码结果都在20万页以上。。。显然,其灵活性的代价就是复杂性。
  关于字符集需要明确以下几点:
一种字符集(character set或charset )对应若干种字符集校正(character set collation),其中只有一种是默认的。而不同的字符集不可能对应同一种字符集校正。
字符集校正是一组规则,用于对对应字符集中的字符进行排序、分辨大小写,音调等等,与字符集的具体编码方法是没有关系的,可以说乱码与字符集校正的关系最多是间接的。
  在数据存储层面上的字符集及字符集校正设置由高层至底层分四个层次:服务器,数据库,表,字段。设置方法有多种,而且每个层次都可以设置独立的字符集和其校正。存储于各层中的数据究竟是何字符集,使用什么字符集校正又有以下规则:
设置的优先级由下至上依次降低,如设置了字段的字符集为“utf8”和其校正为“utf8_general_ci”,那么不论其高层的表等如何设置,存储其中的数据都是“utf8”的,以“utf8_general_ci”为其字符集校正。
如某层没有设置,即依照其高一层的设置;所有都未设置按默认设置。
如果只设置了字符集,字符集校正自动依照其对应的默认值被系统设置。如只设某个表的字符集为“utf8”,那其校正会被自动设置为“utf8_general_ci”;反之,只设置了字符集校正,字符集自动被按其对应的字符集设置。
在与客户端连接层面上牵涉到另外三种字符集和字符集校正,这是客户端发送请求时可以更改的:
character_set_client ,这是用户告诉MySQL查询是用的什么字符集。
character_set_connection ,MySQL接受到用户查询后,按照character_set_client将其转化为character_set_connection设定的字符集。
character_set_results , MySQL将存储的数据转换成character_set_results中设定的字符集发送给用户。
中文世界中使用较多的字符集有UTF8,GB2312,GBK,BIG5等。由于东方文字有很多全角字符,当转换为对应字母文字的字符集时,没有对应编码的全角字符必然显示为乱码,反之则不一定有。
以UTF8为例,首先假设数据库字段设置的字符集是UTF8,则中文乱码出现的原因可能有以下几个:
查询数据库时,character_set_client被设置或默认其他字符集。
提交数据至数据库时,提交数据为UTF8,而character_set_client ,character_set_connection 设置或被默认设为其他字符集,则存入数据库的数据即为乱码。再查询出的必然是乱码。
不用去管字符集校正。
若字段的字符集不是UTF8,不论如何设置,查询、更新数据字段都应显示出或多或少的乱码。
我总结了一下,东方字符集转西方字符集,东方字符全部乱码;西方字符集转东方字符集可能有少量无码;东方字符集互转,可能有部分误码。
所以出现乱码应首先明确使用何种字符集,然后做如下检查:
依次检查MySQL由底层字段到高层系统合层字符集。如有误,导出数据后设置正确后再按正确的字符集导出。
检查character_set_client是否被配置正确。
检查character_set_client ,character_set_connection 是否被配置正确。
  程序里使用set names gb2312 之后,从数据库里读出来的,就是GB2312编码了。

数据库只是用UTF8存储

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-289884-1-1.html 上篇帖子: mysql专门提供了操作用户的方法,而不是直接去对用户表增删改查 下篇帖子: MySQL数据库中对前端和后台进行系统优化
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表