最近在进行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
以上命令就是将一个表
test
的编码改为utf8
4、修改字段的编码:
ALTER TABLE `test` CHANGE `oldfield` `newfield` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
以上命令就是将test表中
oldfield
的字段改为newfield
VARCHAR( 45 ) 为字段属性
编码改为utf8
分享到:
相关推荐
MySQL中文乱码问题解决方案,彻底解决mysql中的中文乱码问题
MySql中文乱码问题 Mysql建库建表 Mysql建库建表中文乱码问题 Mysql中文乱码问题解决方案
经过痛苦的折腾,找到了快速解决mysql烦人的中文乱码问题的办法。希望对大家有所帮助。
linux mysql中文乱码问题,通过修改my.cnf文件,重启mysql服务解决。
Mysql中文乱码问题完美解决方案
解决mysql乱码问题。主要是数据库查询出数据中文为问号???的问题。
java插入mysql中文乱码解决
主要是数据库方面的编码修改,jsp还有tomcat中的修改很简单,这里不做赘述了。
使用 docker 启动 mysql 容器可能会出现中文乱码的情况,这里记录如何制作支持中文的 mysql 镜像 docker版本:18.06 mysql 版本:5.7 1. 创建 my.cnf 文件 [client] default-character-set=utf8 [mysql] default-...
MySQL数据库系统中文乱码问题及解决方案.pdf
关于MySQL中文乱码的解决方法完善版。
mac OSX 系统 MySQL中文乱码解决办法
解决Navicat for MySql 导入EXCEL中文乱码问题解决的有效方法
本文介绍了在mysql安装时选择了utf8编码方式,创建数据库时也选择了utf8,但是通过程序向数据库中插入数据时,仍存在乱码问题的解决方法
个人总结了遇到使用Mysql数据库插入中文时产生乱码问题的解决方法
网上很多关于mysql运行sql语句乱码的解决方法,都没有很好的解决这个问题,经本人不断努力,不断尝试,终于解决这个问题。如有这个问题出现,可参考此文档。
史上最全的PHP+MySql中文乱码解决方案
本文档详细地介绍了如何解决MySql数据库中的中文乱码问题,此问题的解决将极大地帮助基于MySql的PHP编程、JSP编程、Servlet编程及C#或.Net编程!测试过的开发平台包括 Netbeans和Eclipse。测试过的服务器包括Apache、...
针对于mysql数据库,解决表中中文乱码的问题