MySQL数据库系统中文乱码问题及解决方案

2021-09-23 06:08李曼
电子技术与软件工程 2021年12期
关键词:字符集乱码编码方式

李曼

(商丘职业技术学院 河南省商丘市 476100)

1 引言

MySQL数据库技术是一门非常重要的计算机专业基础课程,在WEB应用方面,同时,由于MySQL的跨平台性,它可以在Linux、Windows、Netware等20多个平台上运行。MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),它体积小、速度快、总体成本低,所以MySQL是近年来很多中小型网站开发首要选择的网站数据库软件。MySQL数据库系统使用结构化查询语言(SQL)进行数据库管理。我们通过系统分析把现实世界事物及其联系信息化转换为信息世界里的概念模型,再经过系统数据库设计将我们得到的概念模型转化为计算机世界的数据模型,这一过程我们就需要使用MySQL数据库系统来实现,我们知道,计算机只能识别二进制代码,为了使计算机不仅能做科学计算,也能处理文字信息,人们想出了给每个文字符号编码以便于计算机识别处理的办法,这就是计算机字符集产生的原因。这一套文字符号及其编码、比较规则的集合[1]会直接影响数据库中数据信息的显示,可以以我们希望看的的样式显示,当然也会以我们不希望看到的一种方式——乱码来显示给我们,接下来我们就来探讨一下字符编码为什么会影响字符的显示以及乱码出现的原因及其解决方式。

2 字符编码方式及应用

2.1 常用的字符编码方式

字符编码(英文Character encoding)是为了方便文本在计算机中存储并通过通信网络进行传递,把指定集合中某一对象字符集中的字符进行编码。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其它符号编号,并用7比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以1个字节的方式存储[2]。

在数据库中常见的编码方式有以下几种:

(1)Latin编码方式,这是一种标准字符集(standard character set),支持英文和许多西欧语言。

(2)utf-8编码方式,这是一种支持大部分语言的字符集,为了提高Unicode的编码效率,于是就出现了UTF-8编码。UTF-8可以根据不同的符号自动选择编码的长短。比如英文字母可以只用1个字节就够了。

(3)GB2312码是ANSI编码的一种,为了满足国内在计算机中使用汉字的需要由国家标准总局发布的一系列字符集国家标准编码,GB2312是一个简体的中文字符集。

(4)GBK即汉字内码扩展规范,K为扩展的汉语拼音中“扩”字的声母。关于字符集、语言等信息文件都存放在MySQL软件目录结构下的share文件中[3]。

2.2 字符集编码及校验规则

通过学习MySQL数据库我们知道,show的相关语句内容很多, 它的功能就是可以查看很多内容,服务器可以支持多种字符集,比如show character set;这条语句可以列出可用的字符集,show collation可以列出一个字符集的校对规则,如果想要查看gb2312字符集的校验规则,我们就可以使用show collation like 'gb2312%';这里要明确的一点是:字符集并不完全等同于整理规则, 我们知道同一个字符集可能有多个排序规则,比如latin1 -> latin1_Swedish_Ci, Latin_Spanish_Ci,……因为有时我们在代码里没有指定collation,这时就需要指定一个 default collation,Ci表示 case insensitive 大小写不敏感,cs: case sensitive 大小写敏感,并不是所有的整理规则都要使用ci[3]。

如果想要查看各个字段的整理规则,可以使用show full columns from tablename这条语句,这里需要重申的是;服务器、数据库和数据表都可以指定“字符集”, 而字段却不能指定字符集,字段只能指定“整理规则”,这个整理规则中就可以认为包含了字段的字符集以及比较/排序规则,即使前3个层次的字符集默认的 都是 latin1,但是如果字段的字符集整理为 gbk_chinese_ci的话, 也能正常显示中文[4]。

2.3 出现中文乱码的原因

我们在学习了字符集编码问题后就明白:在显示器上看见的文字、图片等信息在计算机内部存储的内容其实并不是我们看见的样子,也就是计算机并不是简单的原样重现的,即使假如所有的信息都在硬盘中存储,我们拆开它看到了也只有盘片,没有我们想看到的数据信息。计算机硬盘只能用0和1来存储各种信息,比如小张用1100001来表示A,小李用11000010来存储A,可能小李用1100001来存储的是X,那么小张把1100001发给小李,小李就会看成X,这就是小张和小李使用了不同的编码表,不同的编码表0和1的对应关系不同,当然显示的就是不同结果,所以在事先交流数据信息时,需要明确自己要使用的编码,或者通过转换编码,就像翻译不同语言一样,才可以实现无乱码沟通。

在Windows系统中安装MySQL数据库软件时,我们知道MySQL服务器会有一个关于服务器字符集和服务器校验规则的设置,而且这两个设置均不能为空,如果选择默认设置,那么Latin1是MySQL服务器的默认字符集,其对应的校验规则是Latin_Swedish_ci,也 就 是default-character-set=Latin1,collation_server=Latin_Swedish_ci。基于前面的介绍我们知道,latin1字符集不能编码中文字符, 所以MySQL控制台或者返回:“Incorrect string value ......”, 或者返回“Data too long for column ......”,从而导致数据插入不成功,即使插入成功也会在数据表里显示乱码的现象。

3 解决方案

随着我国计算机科学技术的飞速发展,录入中文信息已经变得非常普遍,那么我们在安装和配置MySQL数据库软件时就要考虑到字符编码的问题,所以在我们配置MySQL服务器环境时就需要将字符集(default-character-set)设置为gbk,此时校验规则就会自动跟gbk字符集匹配,当然也可以设置为 gbk_chinese_ci。这里,简单介绍一下存在校对规则命名的约定: 它们以其相关的字符集名开始, 通常包括一个语言名, 并且以 _ci( 忽略大小写) 、_cs( case sensitive, 大小写敏感) 或 _bin( 二进制) 结束。我们可以根据需要选择不同的校验规则。如果在配置过程中忽略了字符集编码的问题,那么也不必担心,我们可以给出以下几种解决方案:

3.1 在DOS环境下修改数据库和数据表的编码方式

我们需要使用alter database petstore character set gbk collate gbk_chinese_ci来修改其字符编码方式,之后在创建数据表时也要保证其字符编码与其所在的数据库一致。可以使用SQL语句show create table 数据表表名,如果从开始都是使用默认字符集,没有修改它的编码方式,此时极可能查看到该数据表的默认编码方式是Latin1,那么我们需要继续使用alter语句来修改,具体SQL语句为Alter table 数据表 default character set gbk collate gbk_chinese_ci,这是更改表默认的字符集的SQL语句。另外,也需要使用上一步的alter database petstore character set gbk collate gbk_chinese_ci把数据库的编码方式也一并修改了,让数据库和它其中的数据表编码方式保持统一,都为gbk,当然gb2312也是可以的。

还有一种情况就是所有的字符集设置都是正确的,但仍然有乱码,这时应该是因为连接级字符集不正确造成的,连接级字符集由character_set_client、character_set_connection、character_set_results三个变量决定,这时需要把这三个变量均设置为支持中文的字符集,比如设置为gbk或者gb2312即可。可以如下三条命令来改变连接级字符集:

3.2 在图形界面环境下修改

除了上述在DOS环境下修改字符编码方式,当然也可以在SQLyog图形编辑器中修改,在左侧数据库目录里选择要修改编码方式的数据库对其右击,选择改变数据库,接着在弹出的窗口中修改其基字符集和数据库排序规则,然后保存更改设置。

3.3 在MySQL配置文件中修改默认字符编码方式

MySQL中文显示乱码或者问号是因为选用的编码不对或者编码不一致造成的,首先我们可以在安装配置MySQL环境时就选择其编码方式为gbk或者gb2312,如果忽略了这一点还有另外一种方法:通过修改my.ini配置文件。通过MySQL文件存放的目录,打开文件名为my.ini配置文件,找到default-character-set这句配置信息,很显然这里指明了当前数据库环境的默认编码方式,此时我们需要将default-character-set设为gbk(或者gb2312)(有的版本不支持default-character-set=gbk,这时我们可以使用character_set_server=gbk来取代 default-character-set=gbk即可),修改之后保存文件,通过进入Windows服务管理器启动MySQL服务,重新启动一下该服务;或者以管理员身份运行cmd.exe,进行如下操作:

关闭服务 net stop mysql;

开启服务 net start mysql。

但此处需要注意的是:我们在my.ini文件中修改的defaultcharacter-set字符集只会对MySQL其自身客户端起作用,对其他客户端数据库程序无效,比如如果是通过web页面显示的数据库内容,开发人员必须在web程序中指定正确的编码方式,如果有误,乱码就会显示在页面中。设置成功之后,就可以来查看是否改变了编码格式。还是在DOS环境中:

(1)输入 mysql -u root –p,进入MySQL数据库 ;

(2)键入密码:*****(自己的密码,没有的话直接回车键。);

(3)show variables like 'char%';显示编码格式;

进入DOS环境或者sqlyog,这时通过show语句查看数据库或者数据表文件,我们就会发现修改已经生效,这时可以通过insert语句试着插入一条中文字符的记录验证一下。

4 总结

综上所述,我们知道MySQL数据库作为全球最受欢迎的数据库平台,正在拥有越来越多的中文编程环境用户,本篇介绍了MySQL数据库中字符编码的相关知识,并且指出我们在使用MySQL数据库会出现的中文乱码现象的根本原因,通过分析乱码问题,我们知道这归根结底是字符集编码的问题,我们通过调试SQL代码细节指出问题所在之处,然后通过实际操作给出了几种切实可行的解决方案,我们只要正确设置各个级别的字符集问题,那么乱码问题就不会成为我们学习中的障碍,这有助于我们更加深入地学习MySQL数据库知识。

猜你喜欢
字符集乱码编码方式
对症下药解决多种乱码难题
这些真的不是乱码,是汉字
ORACLE字符集问题的分析
GCOA算法
ORACLE数据库字符集问题及解决方法
可穿戴式多通道传感系统功能需求分析及设计
医院信息系统Oracle数据库中导入数据中文乱码的解决技术
混合编码方式自适应差分进化算法优化设计宽带天线
炫迈:用神奇乱码勾引你视线
浅谈计算机网络通信中实时差错控制技术