首页 > 数据库技术 > 详细

MySQL中文乱码问题

时间:2016-02-18 17:41:25      阅读:167      评论:0      收藏:0      [点我收藏+]

  在将古诗插入到MySQL数据库后,出现了中文乱码的问题。解决过程中,主要参考了下面几个文章。

字符集与字符编码

http://cenalulu.github.io/linux/character-encoding/

解决MySQL乱码问题

http://cenalulu.github.io/mysql/mysql-mojibake/

http://www.cnblogs.com/sunzn/archive/2013/03/14/2960248.html

http://www.ha97.com/5359.html

一.字符集与字符编码

  字符集规定某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系。

  字符集只是一个规则的集合的名字,对应到真实的生活中,字符集就是对某种语言称呼,如英语,汉语。一个字符集有三个关键的元素:

字库表:所有可读或者可以显示的字符的数据库,决定了这个字符集能够展现的所有字符的范围。

编码字符集:用一个编码值(code point)来表示一个字符在字库表中的位置。

字符编码:编码字符集与实际存储数值之前的转换关系,一般来说都是将code point值作为编码后的值直接存储。如A 在ASCII的表中排第65位,而编码后的A就是65。

问题:字库表中每个字符都有一个自己的序号,直接将序号作为存储内容就可以了,为什么还要通过字符编码把序号转换成另外一种存储格式呢?

原因:统一字库表的目的是能够含有所有的字符,但是实际使用时只会使用一小部分,如中文地区不会使用日语,而一些英语国家甚至只用简单的ASCII字库表就可以了,如果把每个字符都用字库表中的序号来表示,则每个字符都要3个字节(unicode字库为例子),这种情况对原来只战胜一个字符的ASCII编码的国家显然是一个浪费。

二.UTF-8和Unicode的关系

Unicode

编码字符集,随着互联网的发展,对同一字库集的要求越来越迫切,因此出现了Unicode标准,它几乎涵盖了各个国家的语言可能出现的符号与文字,并将它们进行编号。

UTF-8

字符编码,是Unicode规则字库的一种实现形式。虽然它现在是接受度最好的一个字符集编码,但是并没有涵盖整个Unicode的字库。

三.UTF-8编码实现

下面介绍下UTF-8的编码实现,也就是它的物理存储和Unicode序号的转换关系。

UTF-8编码为变长编码,最小编码单位(code unit)为一个字节,一个字节的前1-3个bit为描述性部分,后面为实际序号部分。

  • 如果一个字节的第一位为0,那么代表当前字符为单字节字符,占用一个字节的空间。0之后的所有部分(7个bit)代表在Unicode中的序号。
  • 如果一个字节以110开头,那么代表当前字符为双字节字符,占用2个字节的空间。110之后的所有部分(5个bit)加上后一个字节的除10外的部分(6个bit)代表在Unicode中的序号。且第二个字节以10开头
  • 如果一个字节以1110开头,那么代表当前字符为三字节字符,占用2个字节的空间。110之后的所有部分(5个bit)加上后两个字节的除10外的部分(12个bit)代表在Unicode中的序号。且第二、第三个字节以10开头
  • 如果一个字节以10开头,那么代表当前字节为多字节字符的第二个字节。10之后的所有部分(6个bit)和之前的部分一同组成在Unicode中的序号。

可以看到,UTF-8字符编码是以一定方式实现了Unicode规则的字库。

四.乱码的出现

出现的原因:在编码与解码时使用了不同或者不兼容的字符集。

就如同英语的bless与法语的bless,意思不同一样,同一个汉字在UTF-8中的编码与在GBK中的编码不同,就会出现筹码。

 

MySQL中文乱码问题

原文:http://www.cnblogs.com/chuiyuan/p/5198663.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!