日期:2014-05-16  浏览次数:20722 次

Mysql中文编码问题解决

???? 最近在进行Hive的元数据中文注释的同步,遇到了Mysql中文编码是乱码问题,现在总结一下Mysql编码的基本原理。

???? 我们传统意义上的说的编码其实是指字符集,它包括两个方面,一是存储字符,二是映射关系,也就是真正的编码,各种字符集的存储字符都差不多,而编码却各不相同,是真正有威力的地方。

????? Mysql的字符集有两个概念,一个是"Character set(字符集)",一个"Collations".

先解释一下Collations,它译成中文是"校检",这个在Mysql中使用主要是指导Mysql对字符的比较,比如,ASCII字符集里,Collations规定了a小于b,a等于a,以及a是否等于A之类的,通常基本可以忽略Collations的存在,通常使用默认的字符集即可,默认字符可以选择标准的或者惯用的。

???? 另外一个Character set是一个很广的概念,在Windows下的普通文件,也涉及到字符集的问题,不同的字符集,规定了不同的字符编码方式,我们来看看字符集的组成由两部分:符号和编码,例如,ASCII字符集,包括符号:数字、大小写、分号、换行等,编码方式是用7bit表示一个字符。ASCII只规定了英文的字母编码,非英文语言不能使用ASCII编码表示,为此不同国家,都为自己的语言做了编码,比如我们国家,使用GB2312编码。由于不同的国家都使用自己的编码方式进行编码,常常会导致一些跨平台的应用出现编码问题,所以国际标准化组织考虑采用国际统一的通用编码进行编码,这里最通用是UTF8,ASCII只对英文字符和英文字母进行了编码,GB2312只对英文字符、英文字母、中文字符进行了编码,UTF8对世界上的基本所有常用的语言进行了编码,故这种编码方式是最广泛的字符集。

???? 总结一下,任何文本都会涉及到字符集的问题,字符集包括两个关键部分:1、字符:汉字、英文字母、标点符号、拉丁文等。2、编码:将字符转换成计算机存储的格式,比如,A用65表示。字符集就是用一组字符以及对应的编码方式组成。


前面介绍了字符集和Mysql中字符集和校检,现在对Mysql中的具体情况进行分析:

???? Mysql目前支持多种字符集,并且可以支持字符集之间的转换(但是需要注意字符集之间的转换是否存在编码丢失问题)

???? 由于Mysql中数据存放是分级的,故字符集在不同层级中有相对应的关系,包括服务器级字符集、数据库级字符集、数据表级字符集、表列级字符集,同时如果使用Mysql的命令行还有客户端级字符集(命令行可以通过加入选项default-character-set=*** 指定编码方式),实际上最终使用的字符集是存储字符的列,当然字符集是针对字符类型的列才会有效的,非字符类型比如int类型是无效的。

??? 在实际应用中,服务器->数据库->表->表中的列,字符集是逐级作为默认字符的,即如果本级没有指定字符集类型则会使用上一级的字符集类型作为默认类型作为自己的字符集,而服务器中默认使用的是latin1作为编码方式(哪国人发明自然使用哪国人的,可以理解)

???? 针对具体应用时,Mysql最好在设计数据库表结构是对编码进行统一的设定,如果数据库已经有数据不希望重建,可以使用以下命令对编码方式进行修改:

1、服务器级的编码方式修改暂时没有提供

2、修改数据库级编码,如果是数据库编码不正确: 可以在命令行执行如下命令: ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
以上命令就是将test数据库的编码设为utf8,Collation为
utf8_bin
3、修改表的编码:ALTER TABLE ` test ` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
以上命令就是将一个表