日期:2014-05-16  浏览次数:20805 次

MySQL解决中文乱码问题的通用方法的详细总结
一MySQL解决乱码问题步骤概括
1、所有请求都编码都统一用utf-8,
2、使用Filter过滤所有request和response都设成utf-8,
3、数据库character_set_database设置utf-8,
4、假如character_set_client还是默认的latin1,要在连接数据库时url后面加上转码:
jdbc:mysql://localhost:3306/databasename?useUnicode=true&characterEncoding=utf-8
或者
jdbc:mysql://localhost:3306/databasename?useUnicode=true&characterEncoding=utf-8
如果用的是hibernate
在<session-factory>和</ session-factory>之间加入这么一段:
代码:
        <property name="connection.useUnicode">true</property>
        <property name="connection.characterEncoding">utf-8</property>
5、对于用javascript传递中文参数,要对中文参数字段进行编码,解码
在发送页面要指定编码
例如: str = encodeURI(str); (encodeURI转码后为utf-8)
在接收页面要进行转码
例如: str = new String(str.getBytes("iso-8859-1"),"utf-8");


二MySQL解决乱码问题具体操作
1、修改数据库方法如下:
     ALTER DATABASE sample ####这里修改整个数据库的编码
       CHARACTER SET utf8
       DEFAULT CHARACTER SET utf8
       COLLATE utf8_general_ci
       DEFAULT COLLATE utf8_general_ci;
当然了,你也可在在建数据库的时候指定编码,比如:
   CREATE DATABASE sample
       CHARACTER SET utf8
       DEFAULT CHARACTER SET utf8
       COLLATE utf8_general_ci
       DEFAULT COLLATE utf8_general_ci ;

2、建表的语句
CREATE TABLE `mysqlcode` (
`id` TINYINT( 255 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`content` VARCHAR( 255 ) NOT NULL
) TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;

其中后面的TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;就是指定数据库的字符集,COLLATE (校勘),让mysql同时支持多种编码的数据库。

当然我们也可以通过如下指令修改数据库的字符集
    alter database da_name default character set 'charset'.

3、接下来要做的是打开mysql所在的目录下的my.nin
[client]
port=3306
[mysql]
default-character-set=gbk
[mysqld]
default-character-set=utf8
#重要:这个设置决定MySQL的工作环境的字符集!数据库继承MySQL设置的字符集,而表则继承数据库的字符集,字段则继承表的字符集!所以这里设置很重要!

启动mysql,输入:
执行下列语句,可以查看结果:
mysql> SHOW VARIABLES LIKE '%character%' ;
mysql> SHOW VARIABLES LIKE '%collation%' ;

修改mysql 字符设置,可以采用下述配置(客户端以utf8格式发送 ):
SET character_set_client='utf8'       客户端字符
SET character_set_connection='utf8'
SET character_set_results='utf8'

上面的三行配置就等价于 SET NAMES 'utf8'。
现在用DOS命令 对刚才创建的数据库操作
mysql> use test;
Database changed
mysql> insert into mysqlcode values(null,'php爱好者');
ERROR 1406 (22001): Data too long for column 'content' at row 1
没有指定字符集为gbk,插入时出错
前面插入下面一条语句就可以啦
mysql> set names 'gbk';
Query OK, 0 rows affected (0.02 sec)
mysql> insert into mysqlcode values(null,'php爱好者');
Query OK, 1 row affected (0.00 sec)
制定字符集为gbk,插入成功

4、用到过滤器
有关filter设定的具体代码在文章末尾
然后在web.xml中配置filter(一定要配置在struts filter 之前)
<!-- 解决中文乱码问题 -->
  <filter>
     <filter-name>encodingFilter</filter-name>
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
     <init-param>
             <param-name>encoding</param-name>
             <param-value>GBK</param-value>
     </init-param>