background image

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    数据库采用的字符集

  也就是说,只要保证这几个变量采用一致的字符集,就不会出现乱码问题了。

 

  查看系统的字符集用下面的命令: