当前位置: 首页 > 文章教程  > 计算机与互联网 > 网络编程

8.4.1字符集简介

9/17/2020 9:37:07 PM 人评论

8.4.1字符集简介

8.4 字符集

MySQL数据库服务器支持多种字符集,默认使用的是latin1字符集(西欧ISO_8859_1),但由此可能导致中文乱码问题。为了避免这种问题的发生,有必要深入了解字符集相关概念。

8.4.1 字符集简介

字符(Character)是指人类语言最小的表义符号,例如'A'、'B'等。

给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这个数值就是字符的编码(Character Encoding)。例如,给字符'A'赋予整数0,给字符'B'赋予整数1,则0就是字符'A'的编码,1就是字符'B'的编码。

给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(Character Set)。例如,给定字符列表为{'A', 'B'}时,{'A'=>0, 'B'=>1}就是一个字符集。MySQL中提供了多种字符集,例如latin1、utf8、gbk等。

字符序(Collation)是指在同一字符集内字符之间的比较规则。只有确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系。每个字符序唯一对应一种字符集,一个字符集可以对应多种字符序,其中有一个是默认字符序(Default Collation)。MySQL中的字符序命名规则是:以字符序对应的字符集名称开头,以国家名居中(或以general居中),以ci、cs或bin结尾。例如latin1字符集对应有latin1_swedish_ci、latin1_spanish_ci、latin1_german1_ci等字符序。以ci结尾的字符序表示大小写不敏感,以cs结尾的字符序表示大小写敏感,以bin结尾的字符序表示按编码值比较。例如在字符序gbk_general_ci规则中,字符'a'和'A'是等价的。

8.4.2 MySQL字符集

MySQL对于字符集的指定可以细化到一个数据库、一张表甚至是一列。MySQL提供了7种字符集设置。使用MySQL命令“show variables like 'character%';”,可以查看MySQL当前的字符集,如图8-11所示。图8-11中,character_sets_dir选项定义了MySQL的字符集文件的保存路径为“C:\wamp\bin\mysql\mysql5.1.36\share\charsets\”。其余各项说明如下。

xiao_1 character_set_client:客户端(MySQL命令窗口)的字符集,默认的字符集为latin1。

xiao_1 character_set_connection:连接层字符集,默认的字符集为latin1。

figure_0161_0220
图8-11 MySQL当前的字符集

xiao_1 character_set_database:当前选中数据库的字符集,默认的字符集为latin1。

xiao_1 character_set_filesystem:MySQL服务器文件系统的字符集,默认的字符集为binary。

xiao_1 character_set_results:结果集的字符集,默认的字符集为latin1。

xiao_1 character_set_server:MySQL服务器的字符集,默认的字符集为latin1。

xiao_1 character_set_system:元数据(字段名、表名、数据库名等)字符集,默认的字符集为utf8。

MySQL 还提供了一些字符序设置,这些字符序以字符序的英文单词 collation 开头。使用MySQL命令“show variables like 'collation%';”,可以查看MySQL当前的字符序,如图8-12所示。

figure_0161_0221
图8-12 MySQL当前的字符序

8.4.3 MySQL中的字符集转换过程

了解MySQL中的字符集转换过程可以帮助我们有效解决中文字符的乱码问题。MySQL中的字符集转换过程如下。

(1)打开MySQL console命令窗口客户端,并连接好MySQL服务器后,此时客户端的字符集设置为character_set_client定义的字符集(例如latin1)。

(2)在MySQL console命令窗口中输入MySQL命令或SQL语句,按回车键后,MySQL console命令窗口沿着 MySQL 服务器连接向 MySQL 服务器发送请求数据,此时需要将客户端的请求数据从character_set_client字符集转换为服务器连接的character_set_connection字符集。

(3)MySQL服务器收到MySQL客户端的请求数据后,需要将这些请求数据从服务器连接的character_set_connection字符集转换为MySQL服务器的character_set_server字符集。

说明:若没有设置MySQL服务器的character_set_server字符集,则使用对应数据库字符集的设定值。

(4)若MySQL命令或SQL语句是针对某个数据库的操作,此时需要将请求数据从MySQL服务器的character_set_server字符集转换为某个数据库的character_set_database字符集。

说明:若没有设置某个数据库的 character_set_database 字符集,则使用对应数据库表字符集的设定值。

(5)当MySQL命令或SQL语句执行结束后,将执行结果由数据库character_set_database字符集转换为MySQL服务器的character_set_server字符集。

(6)将执行结果沿着打开的MySQL服务器连接从MySQL服务器的character_set_server字符集转换为character_set_results字符集。

(7)将操作结果从 character_set_results 字符集转换为 character_set_client 字符集,显示到MySQL命令窗口中。

MySQL中的字符集转换过程可以简单地描述为如图8-13所示。

figure_0162_0222
图8-13 MySQL中的字符集转换过程

8.4.4 MySQL字符集的设置

使用默认 latin1 字符集时,虽然大部分情况下都可以解决乱码问题,但缺点是无法以中文字符为单位来进行SQL操作,例如进行中文字符查询时会查询失败。为了有效避免乱码或为了支持中文查询,需要将latin1字符集修改为gbk或gb2312等中文字符集或utf8字符集。以MySQL的字符集设置为gbk为例,MySQL字符集的设置有以下3种方法。

方法1 最为常用的字符集设置方法为修改MySQL的配置文件my.ini中的配置。

例如将default-character-set = latin1和character_set_server = latin1修改为default-character-set = gbk和character_set_server = gbk。保存修改后的my.ini配置文件,重启MySQL服务器即可将latin1默认字符集修改为gbk默认字符集。

方法 2 MySQL 提供的下列命令可以在不影响其他数据库字符集的基础上临时修改当前的字符集(学生管理系统数据库中字符集的设置使用的是第2种方法)。

SET character_set_client = gbk;

SET character_set_connection = gbk;

SET character_set_database = gbk;

SET character_set_results = gbk;

SET character_set_server = gbk;

SET collation_connection = gbk_chinese_ci ;

SET collation_database = gbk_chinese_ci ;

SET collation_server = gbk_chinese_ci ;

修改后使用MySQL命令“show variables like 'character%';”查看MySQL当前的字符集即可,如图8-14所示。然后使用MySQL命令“show variables like 'collation%';”查看MySQL当前的字符序,如图8-15所示。

figure_0163_0223
图8-14 查看MySQL当前的字符集
figure_0163_0224
图8-15 查看MySQL当前的字符序

方法3 MySQL中还可以使用MySQL命令 “set names gbk;”一次性地设置character_set_client、character_set_connection和character_set_results的字符集为gbk,如图8-16所示。

figure_0163_0225
图8-16 使用MySQL命令set names gbk

8.4.5 SQL脚本文件

在MySQL命令窗口上编辑MySQL命令或SQL语句是很不方便的,更多时候需要将常用的SQL语句封装为一个SQL脚本文件,然后在MySQL命令窗口上运行该SQL脚本文件(SQL脚本文件的扩展名一般为sql)中的所有SQL语句。例如在目录“C:\wamp\www”中创建“8”目录,然后在目录“C:\wamp\www\8”中创建init.sql脚本文件,以记事本方式打开该文件后,输入如下MySQL命令。

set table_type=InnoDB;

show variables like 'table_type';

SET character_set_client = gbk ;

SET character_set_connection = gbk ;

SET character_set_database = gbk ;

SET character_set_results = gbk ;

SET character_set_server = gbk ;

SET collation_connection = gbk_chinese_ci ;

SET collation_database = gbk_chinese_ci ;

SET collation_server = gbk_chinese_ci ;

show variables like 'character%';

show variables like 'collation%';

保存该 SQL 脚本文件后,在 MySQL 命令窗口中输入 MySQL 命令“\. C:\wamp\www\ sql\init.sql”或“source C:\wamp\www\sql\init.sql”即可执行init.sql脚本文件中的所有SQL语句,如图8-17所示。为了避免乱码问题的发生,后面所有的SQL语句执行前,建议先执行init.sql脚本文件中的命令。

figure_0164_0226
图8-17 在MySQL命令窗口中执行SQL脚本文件

figure_0164_0227MySQL 命令“\. C:\wamp\www\sql\init.sql”后不能有分号,否则将执行“C:\wamp\www\8\init.sql;” 脚本文件中的SQL语句,而“init.sql;”脚本文件是不存在的。

相关教程

共有条评论 网友评论

验证码: 看不清楚?