阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

如何解决MySQL字符集乱码问题

43次阅读
没有评论

共计 3223 个字符,预计需要花费 9 分钟才能阅读完成。

导读 MySQL 自 4.1 版本推出之后由于中文的特殊性带来的乱码问题也随在互联网行业出现。主要原因就是不同字符集编码不同而产生的。本文简要介绍字符集相关知识及部分乱码情况的解决方式。
一、字符集本概念

字符集的基本概念如下 :

字符 (Character) 是指人类语言中最小的表义符号。例如’A’、’B’等
  给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding)。例如,我们给字 符’A’赋予数值 0,给字符’B’赋予数值 1,则 0 就是字符’A’的编码
  给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集 (Character Set)。例如,给定字符列表为{’A’,’B’} 时,{’A’=>0,‘B’=>1}就是一个字符集
  字符序 (Collation) 是指在同一字符集内字符之间的比较规则
  确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系
  每个字符序唯一对应一种字符集,但一个字符集可以对应多种字符序,其中有一个是默认字符序(Default Collation)
  MySQL 中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以_ci(表示大小写不敏感)、_cs(表示大小写敏感)或_bin(表示按编码值比较)结尾。例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等价的。
二、常见字符集
1)ASCII

ASCII 是英文 American Standard Code for Information Interchange 的缩写, 美国标准信息交换代码是由美国国家标准学会 (American National Standard Institute , ANSI) 制定的,标准的单字节字符编码方案,用于基于文本的数据。是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。它是现今最通用的 单字节编码系统,并等同于国际标准 ISO/IEC 646。

ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础 ASCII 码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号,以及在美式英语中使用的特殊控制字符。

2)GBK

GBK 即汉字内码扩展规范,K 为扩展的汉语拼音中“扩”字的声母。英文全称 Chinese Internal Code Specification。GBK 编码标准兼容 GB2312,共收录汉字 21003 个、符号 883 个,并提供 1894 个造字码位,简、繁体字融于一库。

GB2312 码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,1980 年由国家标准总局发布。基本集共收入汉字 6763 个和非汉字图形字符 682 个,通行于中国大陆。新加坡等地也使用此编码。GBK 是对 GB2312-80 的扩展,也就是 CP936 字码表 (Code Page 936)的扩展(之前 CP936 和 GB 2312-80 一模一样)。

3)latin1

Latin1 是 ISO-8859- 1 的别名,有些环境下写作 Latin-1。

ISO-8859-1
ISO-8859- 1 编码是单字节编码,向下兼容 ASCII,其编码范围是 0x00-0xFF,0x00-0x7F 之间完全和 ASCII 一致,0x80-0x9F 之间是控制字符,0xA0-0xFF 之间是文字符号。

ISO-8859- 1 收录的字符除 ASCII 收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在 ISO-8859- 1 当中。

因为 ISO-8859- 1 编码范围使用了单字节内的所有空间,在支持 ISO-8859- 1 的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作 ISO-8859- 1 编码看待都没有问题。这是个很重要的特性,MySQL 数据库默认编码是 Latin1 就是利用了这个 特性。ASCII 编码是一个 7 位的容器,ISO-8859- 1 编码是一个 8 位的容器。

4)UTF-8

UTF-8(8-bit Unicode Transformation Format)是一种针对 Unicode 的可变长度字符编码,又称万国码。由 Ken Thompson 于 1992 年创建。现在已经标准化为 RFC 3629。UTF- 8 用 1 到 4 个字节编码 UNICODE 字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如日文,韩文)

UTF- 8 以字节为单位对 Unicode 进行编码。

UTF- 8 的特点是对不同范围的字符使用不同长度的编码。对于 0x00-0x7F 之间的字符,UTF- 8 编码与 ASCII 编码完全相同。UTF-8 编码的最大长度是 4 个字节。

从上表可以看出,4 字节模板有 21 个 x,即可以容纳 21 位二进制数字。Unicod 的最大码位 0x10FFFF 也只有 21 位。

如何解决 MySQL 字符集乱码问题

三、MySQL 字符集转换过程

1. MySQL Server 收到请求时将请求数据从 character_set_client 转换为 character_set_connection

2. 进行内部操作前将请求数据从 character_set_connection 转换为内部操作字符集,其确定方法如下:

1) 使用每个 Column 的 CHARACTER SET 设定值;
2) 如未设置 Column 的 Character SET,则使用对应表的 DEFAULT CHARACTER SET 设定值
3) 如 Column、Table 均未设地 Charater SET,则使用对应数据库的 DEFAULT CHARACTER SET 设定值
4) 如 Column、Table、Database 均未设地 Charater SET,则使用 character_set_server 设定值。

3. 将操作结果从内部操作字符集转换为 character_set_results

如何解决 MySQL 字符集乱码问题

四、中文乱码现象

Mysqldump 导入乱码

如何解决 MySQL 字符集乱码问题

Load data 导入乱码

如何解决 MySQL 字符集乱码问题

五、程序及 MySQL 字符集配置情况

出现乱码情况,首先确认写入程序使用的字符集,MySQL 使用的字符集
MySQL 使用的字符集情况

通过 SHOW VARIABLES LIKE‘character%’,在上面例子中通过语句获得字符集设置情况如下:

如何解决 MySQL 字符集乱码问题

Mysqldump 导入乱码原因 :

1、首先确认 mysqldump –help 或查看备份文件头部信息确认默认字符集
在上例中通过 mysqldump –help 查看

通过备份文件查看

如何解决 MySQL 字符集乱码问题

2、通过 mysql –help 确认导入字符集

default-character-set        gbk

导入的两种情况如下

1)不修改备份文件,导入由于 sql 文件中存在 set names utf8,则导入后字符集使用的依然是 utf8, 在系统默认显示字符集为 gbk 的情况下,则显示为乱码,此时则需要使用 set names utf8 才能正常显示字符

2)修改备份文件,导入前将 sql 中的 set names utf8 去除,在 mysql 默认字符集为 gbk 的情况下导入后字符集为 gbk, 此时 mysql 显示字符集为 gbk,两者一致,则显示正常

Load data 导入乱码原因

如何解决 MySQL 字符集乱码问题

对于 load data 导入乱码问题的具体解释在官方文档中有提及,请参考:

如何解决 MySQL 字符集乱码问题

这些是无法影响到导入结果的,因此应使用 Load 自身的字符集参数来进行数据导入,如下方式:

mysql>load data infile '/tmp/gongzuoshi.ttt' into chartest ; CHARACTER
SET gbk
六、总结
1、编译安装 MySQL 的时候指定 DEFAULT_CHARSET=[charset] 与写入程序保持一致
2、my.cnf 中字符集设置与写入程序保持一致
3、导入数据时,将导入程序与数据库的链接配置为与数据库字符集一致
4、load data 需要在语句中设置字符集参数

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计3223字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中