APP下载

MySQL数据库字符集的问题研究

2020-02-04石丽怡

电子技术与软件工程 2020年12期
关键词:字符集乱码数据表

石丽怡

(海南政法职业学院 海南省海口市 571100)

MySQL 数据库是瑞典MySQL AB 公司开发的一个小型关系型数据库管理系统。目前被广泛地应用在Internet 加上的中小型网站。MySQL 数据库是开源数据库。开源数据库的特点是速度快、易用性好、支持SQL、对网络支持性好、可移植性好、费用低等。这些特点使得MySQL 成为“最受欢迎的开源数据库”。在2020年4月份的DB-Engines 数据库流行度排行榜[1]中My SQL 排名中排名第2 位。

1 MySQL字符集概述

字符集是指一种从二进制编码到某类字符符号的映射,校对是指一组用于某个字符集的排序规则。并且每一类编码字符都有其对应的字符集和校对规则。

只要涉及到中文的地方,就会存在字符集和编码方式,MySQL可以支持很多种字符集,在同一台服务器,同一个数据库,甚至同一个表的不同字段都可以指定使用不同的字符集。相比其他数据库管理系统,MySQL 要更加灵活些。正是因为MySQL 的字符集的灵活性,也体现了MySQL 的字符集负责性和繁琐性,使得我们在实际得应用过程中,经常出现MySQL 数据库中的文字不能正常显示,会出现乱码等情况。

2 支持中文的字符集

支持中文的字符集主流有三种:UTF-8 字符集、GBK 字符集和GB2312 字符集。

2.1 UTF-8字符集

是一种多字节的国际编码,通用性强,它包含全世界所有国家需要用到的字符,英文用1 个字节(即8 位二进制),中文使用3个字节(24 位)来进行编码, 其编码的文字可以在各国支持utf-8字符集的浏览器上显示。例如在utf-8 编码下,英文的IE 也能显示中文,无需再额外下载支持包。

2.2 GBK字符集

GBK 是国家标准编码,通用性比较差,是GB2312 的扩展字符集,其文字编码不论中文还是英文均采用双字节表示,只对中文有区分,GBK 包含全部的中文字符。

2.3 GB2312字符集

GB2312 全称是“信息交换用汉字编码字符集”,由中华人民共和国国家标准总局于1980年发布,1981年5月1日起实施,是汉字字符集编码,是最基本的汉字编码集。它共有、收录了7445个字节,其中简化汉字6763 个,字母和符号682 个。只支持简体中文。

2.4 字符集的选择

这三中字符集都可以显示中文字符,用于GB 是国标的意思,GB2312 和GBK 主要用于汉字的编码,而utf-8 是全世界通用的。GBK 和UTF-8 功能一样,但是编码方式不一样,GBK 的中文和英文编码是双字节,而UTF-8 是多字节编码,英文使用1 个字节,中文使用3 个字节来编码,所以,对于英文较多的网站则用UTF-8节省空间。如果开发的网站是不对外开放的中文网站,那么使用GB2312 和GBK 就够了,如果开发的网站是全球通用就要设置称UTF-8

3 MySQL数据库的字符集问题

在使用MySQL 数据库时,总结了以下几种,MySQL 中出现中文乱码的问题:①数据库中的中文字符,乱码显示。②web 页面显示数据库中文字符时出现乱码。③不能储存时下比较流行的emoji 表情。

分析产生乱码原因:

(1)要了解MySQL 中字符集相关变量,首先了解其含义:

如表1 所示,默认的字符集可在3 个级别进行定义,分别是数据库服务器(database sever)级别,数据库(database)级别,数据表(table)级别以及字段(column)级。数据库服务器(database sever)级别是在数据库系统的配置文件my.ini(windows)或my.cnf(linux)上进行修改。可按以下步骤查询配置文件my.ini 的位置:

①命令:select @@dasedir 查询MySQL 在本机中的安装目录。

②命令:select @@datadir 查询my.ini 所在的位置。

(2)了解完整的字符集流转过程:

①mysql 服务器收到客户端发送过来的请求时,从 character_set_client 转换为character_set_connection。

②进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,方法如下:使用每个字段coulumn的CHARACTER SET 设定值;若未设置字段coulumn 的CHARACTER SET,则使用对应数据表的default_character_set 设定值;若Column、Table 均未设置Charater SET,则使用对应数据库的DEFAULT CHARACTER SET 设定值;如Column、Table、Database 均未设地Charater SET,则使用服务器的character_set_server 设定值。

③最后将操作结果从内部操作字符集转换为character_set_results。

4 针对以上问题的解决方法

4.1 数据库中的中文字符,乱码显示

(1)假设在安装MySQL 数据库是默认安装,那服务器默认的字符集一般是latin1。在建库和建表时如果没有指定其他的字符集,那么数据库则沿用服务器默认的字符集latin1。latin1 字符集不能显示中文字符,会提示如下所示错误。

表1

表2

解决方法:将数据库字符集修改为utf8 或者GBK 即可。

命令:alter database tty character set ‘utf8’;

(2)还有一种情况就是sever 为utf8,但是column 为latin1,也会提示错误。

解决方法:将数据表字符集修改为utf8 或者GBK。

命令:alter table yyyu convert to character set ‘utf8’.

4.2 Web页面显示数据库中文字符时出现乱码

(1)假设客户端向MySQL 服务器发送了一组UTF-8 命令,而的此时服务器端字符集假设是latin1,即Character_set_client 为Latin1,那么存储到数据库中的文字信息就会变成乱码。

(2)假设服务器端向客户端发送了latin1 编码数据,但是客户端的编码形式为UTF-8,那么现实在web 页面上的中文信息也是乱码。

以上两种情况如表2 所示。

解决方法:将服务器端的Character_set_connection、Character_set_client、Character_set_results 三个系统变量的值设置为web 客户端的字符集utf-8 即可解决乱码问题。一可采用相关命令进行更改,最直接的方法是找到配置文件my.ini 进行如下修改:

4.3 不能存储emoji表情

Emoji 是时下比较流行的表情符号,也数据一种数据。可保存在MySQL 数据库中,在存储时若操作不当会出现incorrect string value 这个错误。这是因为emoji 表情是4 个字节的,而大家普遍认为utf-8 就是万能的字符集了,在笔者遇到这个问题时也是一直这么认为的,直到遇到emoji 表情。很明显3 个字节的utf-8 不能容纳4 个字节的emoji 表情。这个时候MySQL 数据库为了解决这个问题,在5.3 版本之后新增了一个utf-8 字符集编码utf8mb4 编码,之前编码一直是utf8 编码,utf8mb4 是utf8 的超级,占4 个字节,能够向下兼容utf8。

解决方法:

(1)修改三级编码。

①修改数据库编码:ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

②修改数据表编码:ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

③修改表字段编码:ALTER TABLE table_name CHANGE column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

(2)修改my.ini 配置文件。

MySQL 作为全世界最受欢迎的开源数据库平台,拥有越来越多的编程爱好者,在中文环境下编程的用户越来多,而使用过程中出现乱码或者数据不能存储的问题进行了研究,经过反复操作实验,提出了具体的解决方案。

猜你喜欢

字符集乱码数据表
ORACLE字符集问题的分析
基于列控工程数据表建立线路拓扑关系的研究
ORACLE数据库字符集问题及解决方法
医院信息系统Oracle数据库中导入数据中文乱码的解决技术
.Net框架联合Oracle字符集问题研究
炫迈:用神奇乱码勾引你视线
图表
基于VSL的动态数据表应用研究
如何解决Tomcat的乱码