zoukankan      html  css  js  c++  java
  • 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,这样做的目的在于,即可以允许你往数据中插入中文字符,又可避免中文乱码的问题。

  • 相关阅读:
    Jenkins发布遇到的问题
    js相关问题总结
    代码洁癖症轻度患者-页面显示状态判断解决方案
    eclipse没有打断点,项目确仍然要进入断点的问题。
    liunx新装tomcat之后,tomcat不能识别新发布的项目
    phpstorm+xdebug单步调试的配置
    laravel 路由前缀,路由名称前缀区别
    Specified key was too long ... 767 bytes
    postman 自动化测试
    Linux top输出st 的值过高导致系统负载过高
  • 原文地址:https://www.cnblogs.com/fanfan259/p/2921849.html
Copyright © 2011-2022 走看看