background image

    mysql> show variables like '%character%';
    +--------------------------+--------------------------------------------------+
    | Variable_name            | Value                               |
    +--------------------------+--------------------------------------------------+
    | character_set_client     | utf8                                    |
    | character_set_connection | utf8                                    |
    | character_set_database   | utf8                                    |
    | character_set_filesystem | binary                                    
    | character_set_results    | utf8                                     |
    | character_set_server     | utf8                                     |
    | character_set_system     | utf8                                    |
    | character_sets_dir       | /usr/local/workspace/mysql/share/mysql/charsets/ |
    +--------------------------+--------------------------------------------------+
    8 rows in set (0.00 sec)
   
    mysql>
  可以看到,我的这几个变量都是一致的。但如果不一致呢

?网上许多教程告诉你“你 set 

names 下就解决了”。         
   那 么

set  names 是什 么呢 ?  set  names 实际 上就 是同 时设 置了   character_set_client  ,

character_set_connection 和 character_set_results 这三个系统变量。     
  例如在

mysql 命令行上输入 set names 'gbk' 命令等同于:    

  

SET character_set_client = gbk;         

  

SET character_set_connection = gbk;     

  

SET character_set_results = gbk;        

  很多情况下,这样设置了之后就能把乱码问题解决了。但是还是不能完全避免出现乱码
的可能,为什么呢

?

    因 为

character_set_client  , character_set_connection  这 两 个 变 量 仅 用 于 保 证 与

 

character_set_database 编码的一致,而 character_set_results 则用于保证 SELECT 返回的结果
与程序的编码一致。

 

  例如,你的数据库

(character_set_database)用的是 utf8  的字符集,那么你就要保证

 

character_set_client ,character_set_connection 也是 utf8 的字符集。   
    而 你 的 程 序 也 许 采 用 的 并 不 是

utf8  , 比 如 你 的 程 序 用 的 是 gbk  , 那 么 你 若 把

 

character_set_results  也 设 置 为   utf8  的 话 就 会 出 现 乱 码 问 题 。 此 时 你 应 该 把

 

character_set_results 设置为 gbk。这样就能保证数据库返回的结果与你的程序的编码一致。

 

  到此应该就可以解决绝大多数我们遇到的乱码问题了,另外还必须强调的是,有时候
乱码的出现有可能是以上几种原因混合造成的。

 

  总而言之,我们应当尽量的保证数据库中的数据是正确的,就是客户端到服务器端或
者服务器端到客户端转换的过程中不要产生乱码,那么问题处理起来就相对简单了。

           

  四、总结

    

  为便于大家记忆,总结为以下四点:

     

   

1 、 要 保 证 发 送 的 数 据 与 数 据 库 的 字 符 集 一 致 , 即

 

character_set_client,character_set_connection 与 character_set_database 一致。           
   

2 、 要 保 证 数 据 库 中 存 储 的 数 据 与 数 据 库 编 码 一 致 , 即 数 据 的 编 码 与