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

  • 相关阅读:
    SuperMap房产测绘成果管理平台
    SuperMap产权登记管理平台
    Android adb shell am 的用法(1)
    由浅入深谈Perl中的排序
    Android 内存监测和分析工具
    Android 网络通信
    adb server is out of date. killing...
    引导页使用ViewPager遇到OutofMemoryError的解决方案
    adb logcat 详解
    How to send mail by java mail in Android uiautomator testing?
  • 原文地址:https://www.cnblogs.com/fanfan259/p/2921849.html
Copyright © 2011-2022 走看看