mysql 字符集乱码问题分析与解决办法
每次搭建 mysql 开发环境时总会遇到乱码问题,虽然能解决,但是不知道具体原理。 通
过下文可以弄清楚
mysql 数据库字符存储的原理。
以下为查询的资料:
MySQL 4.1 及 以 上 版 本 的 字 符 集 支 持 (Character Set Support) 有 两 个 方 面 : 字 符 集
(Character Set)和校对规则(Collation)。 字符集和校对规则有 4 个级别的默认设置:服务器
(server),数据库(database),数据表(table)和连接(connection)。
MySQL 中是根据下面几个变量确定服务器端和客户端用的什么字符集:
character_set_client 客户端字符集
character_set_connection 客户端与服务器端连接采用的字符集
character_set_results SELECT 查询返回数据的字符集
character_set_database 数据库采用的字符集
MySQL 的字符集处理是这样的:
1、发送请求。
1)客户端发送请求到服务器端。
2)服务器端会把请求的数据从客户端字符集(character_set_client)转成服务器连接字符
集
(character_set_connection)。
3)然後服务器会检测存储区域(table,column)的字符集,然后把数据从连接字符集
(character_set_connection)转为存储区域(table,column)的字符集,然後再存储或者查询。
2、返回请求。
1) 服 务 器 将 存 储 区 域 (table , column) 的 字 符 集 转 换 成 服 务 器 连 接 字 符 集
(character_set_connection)。
2) 将 服 务 器 连 接 字 符 集 (character_set_connection) 转 换 成 结 果 字 符 集
(character_set_results),再发送到客户端。
例如,我建立一个字符集为
gbk 的数据库(服务器端)。(MySQL 4.1 开始,在建立数据库
时要指定它的字符集和校对规则,不指定就用默认的字符集和校对规则。
)
连接数据库的程序
(客户端)使用 gb2312 字符集(如 windows 命令行下使用 MySQL ,或
者
PHP 连接 MySQL ),那么在执行 insert 命令时,insert 的字符串将做一个 gb2312 到 gbk
的转换。而
select 时,数据库中保存的数据会先经过 gbk 到 gb2312 的转换之后再给你(结果
集
)。
三、解决方案
了解了
MySQL 4.1.x 以上版本字符集处理的过程,我们就知道了怎么从原理上解决这
个问题。
思路:让服务器端和客户端的字符集保持一致。
服务器端的编码是由字符集
(Character Set)和校对规则(Collation)决定的。
上面提到,
MySQL 中是根据下面几个变量确定服务器端和客户端用的什么字符集:
character_set_client 客户端字符集
character_set_connection 客户端与服务器端连接采用的字符集
character_set_results SELECT 查询返回数据的字符集
character_set_database 数据库采用的字符集
也就是说,只要保证这几个变量采用一致的字符集,就不会出现乱码问题了。
查看系统的字符集用下面的命令: