Mysql 字符串编码,解决各种乱码问题

Mysql 5.0 之后对字符的编码处理基本上很完善了。因此,如果出现编码问题,基本上是使用者的问题。如出现此类问题,基本上是可以用修改配置或写sql处理来解决的。(之前我想写代码或用工具软件处理,事实上不需要)

      如有编码问题,需要考虑的问题有3个:

      1:数据表结构中对字符编码的设定是否合适

      2:连接编码设定是否合适

      3:你的程序对编码的处理是否合适

      对应的解决办法有:

      1:一般情况下,(char类型)字段的编码声明和其内容的实际编码是一致的。这样的话基本不太容易出乱码问题,有也好解决。关键是可能会不一致,只要是 这种情况基本上都会出乱码,也比较难解决,比如字段声明中的编码使用的是latin1,而实际写入的内容是GBK编码的。对于不一致的情况,第一更改表结 构使其一致。(如不方便)第二在语句中进行编码转换。

            a:更改表结构的方法。直接更改是不行的,mysql会做默认的字符编码转换。但可以把字段声明先更改为binary结构,以避免这种默认转换,例如:假 设原有字段声明是colu1 varchar(255) ,可以 alter table t_t modify column colu1 binary(255) ; 然后再 alter table t_t modify column colu1 varchar(255) character set gbk ; 注意:最后的字符编码要和实际内容的编码一致。但是这样转换会导致字段编程255长度的。因此 上面的第一个语句中的 binary(255)也可以写成binary。

            b:检索语句。使用cast函数和convert函数:select cast(binary colu1 as char character set gbk) from t_t; 注意:语句中的binary是必须的,其目的也是先把字段转换为二进制属性,避免字符属性引发的编码自动转换。注意:上述语句并不引发实际的编码转换,只 是对字段的编码说明做了转换,使其和实际内容一致。

      2:设置连接编码:这部分编码一般是由3个变量组成:

             character_set_client :告诉mysql你输入的字符编码是什么

             character_set_results :告诉mysql你想在客户端得到的编码是什么

             character_set_connection:告诉mysql它从连接那里得到内容的字符编码是什么

            通常上述3个等同于一个命令:set names X 。其中X是编码名称,例如:gbk,utf8,latin1等。

            通常,如果字段内容的实际编码和字段编码的声明是一致的,你只需要set names命令就可以得到你想要的编码了:例如:字段编码声明和字段内容的实际编码都是GBK,而你想在客户端得到utf8编码。你可以运行:set names utf8;然后你可以正常的使用查询语句,你在客户端得到的语句中的字符类型字段返回的结果的编码就是utf8的了。

           对于java,jdbc是可以自动解析服务器端编码的,连set names都不用运行了。也不需要在连接字符串中指定编码。如果在java自行检索语句得到的也是乱码,基本上就是第一个问题,或者字段中存储的就是错误的乱码。

      3:程序错误这里就不讨论了。

      我遇到的问题:字段声明是latin1。字段实际内容的编码是GBK。我需要在程序中得到的编码是utf8。我解决的方法是:

        set names utf8;

        select cast(binary colu1 as char character set gbk) as colu1 from t_t;

       ------------假设不使用set names utf8,也就是不管在什么环境下,我都需要得到utf8编码---------------

      select convert(cast(binary colu1 as char character set gbk) using utf8) as colu1 from t_t;

      有时:你使用的Mysql客户端是命令行的,为了避免在网络传输时,mysql对字符编码做转换,你可以:

      select binary convert(cast(binary colu1 as char character set gbk) using utf8) as colu1 from t_t;

      这是我最近解决一个Mysql编码问题后得到的经验总结。

      如果你理解了上述 4个语句的实际含义。那么mysql中的编码问题基本上都可以解决了。当然最好还是在设计数据库时就弄好库,表结构和编码,设置好服务器的编码属性。那么就不需要费劲解决字符编码问题了。

 

 

如何设置MySQLutf8

Mysql要解决中文乱码,最好是你把数据库的默认编码都改掉,我一般这样处理:
在mysql安装目录下的my.ini文件中做如下修改:
[mysql]下面修改
default-character-set=utf8
[mysqld]下面修改
default-character-set=utf8
把编码统一成utf8,这样做的目的在于,即可以允许你往数据中插入中文字符,又可避免中文乱码的问题。

posted @ 2013-02-22 10:30  糖糖果  阅读(1871)  评论(1编辑  收藏  举报