`
liqita
  • 浏览: 291381 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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>
  </filter>

  <filter-mapping>
      <filter-name>encodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

5.js 编码
js中escape,encodeURI,encodeURIComponent三个函数的区别
js对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent
    a、传递参数时需要使用encodeURIComponent,这样组合的url才不会被#等特殊字符截断。                           
例如:<script language="javascript">document.write('<a href="http://passport.baidu.com/?logout&aid=7&u='+encodeURIComponent("http://cang.baidu.com/bruce42")+'">退出</a>');</script>
     b、进行url跳转时可以整体使用encodeURI
例如:Location.href=encodeURI("http://cang.baidu.com/do/s?word=百度&ct=21");
     c、js使用数据时可以使用escape
[Huoho.Com编辑]
例如:搜藏中history纪录。
     d、escape对0-255以外的unicode值进行编码时输出%u****格式,其它情况下escape,encodeURI,encodeURIComponent编码结果相同。
最多使用的应为encodeURIComponent,它是将中文、韩文等特殊字符转换成utf-8格式的url编码,所以如果给后台传递参数需要使用encodeURIComponent时需要后台解码对utf-8支持(form中的编码方式和当前页面编码方式相同)
escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z
encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z

三 MySQL中文乱码解决方案集锦
1.建立数据库是一般的语句: create database dbname;
2.在库中建表时语句为:
create table tbname(..........)engine=MyISAM character set gbk collate gbk_chinese_ci;
3.程序中连接数据库的Connection对象需要写成Connection con = DriverManaager.getConnection("jdbc:mysql://...user=..&password=...&useUnicode=true&characterEncoding=gbk");
4.若在终端下用mysql命令向数据库插入数据,则在进入mysql时的命令写成:#mysql --default-character-set=gbk -u ... –p
5.常用的修改语句:
alter database 'test' default character set utf8 collate utf8_bin
alter table 'category' default character set utf8 collate utf8_bin
alter table 'test' change 'dd' 'dd' varchar(45) character set utf8 collate utf8_bin
mysql_connect('localhost','user','password');
mysql_select_db('my_db');
mysql_query("set names utf8;");
mysql_query("set character set utf8");
6.在jsp页面的编码设置为utf-8.


四 关于MySQL(4.1以后版本) 服务器中的六个关键位置字符集的概念
client 、connection、database、results、server 、system。
MySQL有两个字符集概念:一个就是字符集本身,一个是字符集校验规则。字符集影响数据在传输和存储过程中的处理方式,而字符集校验则影响ORDER BY和GROUP BY这些排序方式。
1. 和存储有关的
character_set_server: 服务器字符集,服务器安装时指定的默认字符集设定。
character_set_database: 库字符集,数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。
character_system: 数据库系统使用的字符集设定。
在创建一个表的时候,每个字段只要不是binary,都会有一个字符集。如果不指定,那么在SHOW CREATE TABLE的时候,它是不会显示出来的。、
2. 和传输有关的
character_set_connection: 连接数据库的字符集设置类型,如果没有指明连接数据库使用的字符集类型就按照服务器端默认的字符设置
character_set_results: 数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集
character_set_client: 客户端使用的字符集,客户端发送过来文字的字符集
通常的使用中,character_set_client,character_set_connection这两个变量的值是一样的,也就是说查询不需 要进行编码转换。这样看来变量character_set_connection有些多余。当查询进入时,查询会被服务器从 character_set_client转换到character_set_connection,当查询执行时,查询会被服务器从 character_set_connection转换到列字符集。查询反回时,数据直接被服务器从列字符集转换到 character_set_results。很显然查询进入比查询返回多经历了一次转换
3.字符集的校对规则
字符集的校对规则设定分别由上面的character_set_connection, character_set_database, character_set_server决定
collation_connection: 连接字符集的校对规则
collation_database: 默认数据库使用的校对规则。当默认数据库改变时服务器则设置该变量。如果没有默认数据库,变量的值采用collation_server的值
collation_server: 服务器的默认校对规则
4. 字符集编码的关联规则
a、要保证数据库中存的数据与数据库编码一致,即数据编码与character_set_database一致;
b、要保证通讯的字符集与数据库的字符集一致,即character_set_client,character_set_connection与character_set_database一致;
c、要保证SELECT的返回与程序的编码一致,即character_set_results与程序编码一致;
d、要保证程序编码与浏览器编码一致,即程序编码与<meta http-equiv="Content-Type" content="text/html; charset=?"/>一致。




附件:关于filter的具体设定
因为网络中字符在传递的时候,都是统一以iso-8859-1的编码传递,所以我们必须对request重新设定字符集,才能正常显示中文。如果采用filter类来实现,我们不用在每次取中文参数时都要重新设定。

filter类的内容:

/*
* ====================================================================
*
* javawebstudio 开源项目
*
* struts_db v0.1
*
* ====================================================================
*/
package com.strutslogin.util;

import java.io.ioexception;

import javax.servlet.filter;
import javax.servlet.filterchain;
import javax.servlet.filterconfig;
import javax.servlet.servletexception;
import javax.servlet.servletrequest;
import javax.servlet.servletresponse;

/**
* 中文过滤器
*/
public class setcharacterencodingfilter implements filter {

// ----------------------------------------------------- instance variables

/**
* the default character encoding to set for requests that pass through
* this filter.
*/
protected string encoding = null;

/**
* the filter configuration object we are associated with. if this value
* is null, this filter instance is not currently configured.
*/
protected filterconfig filterconfig = null;

/**
* should a character encoding specified by the client be ignored?
*/
protected boolean ignore = true;

// --------------------------------------------------------- public methods

/**
* take this filter out of service.
*/
public void destroy() {

this.encoding = null;
this.filterconfig = null;

}

/**
* select and set (if specified) the character encoding to be used to
* interpret request parameters for this request.
*
* @param request the servlet request we are processing
* @param result the servlet response we are creating
* @param chain the filter chain we are processing
*
* @exception ioexception if an input/output error occurs
* @exception servletexception if a servlet error occurs
*/
public void dofilter(servletrequest request, servletresponse response,
filterchain chain)
throws ioexception, servletexception {

// conditionally select and set the character encoding to be used
if (ignore || (request.getcharacterencoding() == null)) {
string encoding = selectencoding(request);
if (encoding != null)
request.setcharacterencoding(encoding);
}

// pass control on to the next filter
chain.dofilter(request, response);

}

/**
* place this filter into service.
*
* @param filterconfig the filter configuration object
*/
public void init(filterconfig filterconfig) throws servletexception {

this.filterconfig = filterconfig;
this.encoding = filterconfig.getinitparameter("encoding");
string value = filterconfig.getinitparameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsignorecase("true"))
this.ignore = true;
else if (value.equalsignorecase("yes"))
this.ignore = true;
else
this.ignore = false;

}

// ------------------------------------------------------ protected methods

/**
* select an appropriate character encoding to be used, based on the
* characteristics of the current request and/or filter initialization
* parameters. if no character encoding should be set, return
* <code>null</code>.
* <p>
* the default implementation unconditionally returns the value configured
* by the <strong>encoding</strong> initialization parameter for this
* filter.
*
* @param request the servlet request we are processing
*/
protected string selectencoding(servletrequest request) {

return (this.encoding);

}

}//eoc


该代码来自于www.javawebstudio.com,特此感谢!

然后我们在web.xml中加一些配置,就可以了,配置如下:

<filter>
<filter-name>set character encoding</filter-name>
<filter-class>javawebstudio.struts_db.setcharacterencodingfilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gbk</param-value>
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>set character encoding</filter-name>
<servlet-name>action</servlet-name>
</filter-mapping>

放在web.xml的合适位置。一般在最后,<jsp-config>标签之前(如果有的话)

经过以上步骤,jsp和mysql的中文显示及插入就都正常了。在struts中也正常。
分享到:
评论

相关推荐

    Mysql插入中文乱码问题解决

    解决 MySQL 中文乱码问题的方法主要有以下几种: 1. **在 JDBC 连接字符串中添加字符集参数** - 在使用 Java 等语言连接 MySQL 数据库时,可以在 JDBC 连接字符串中添加 `useUnicode=true&characterEncoding=utf-8...

    mysql中文乱码的解决方法

    针对以上问题,本文将详细介绍如何彻底解决MySQL中的中文乱码问题,并推荐使用`utf8`或`utf8mb4`字符集,因为它们能兼容世界上绝大多数字符。 #### 二、解决步骤 ##### 步骤一:配置my.ini文件 1. **定位my.ini...

    MySQL5.6中文乱码问题

    以下是解决MySQL 5.6中文乱码问题的详细步骤和相关知识点。 1. **理解字符集与编码** - **字符集(Character Set)**:字符集是一系列字符的集合,如ASCII、GB2312、GBK、UTF-8等。它定义了系统能识别和处理哪些...

    Linux下MySQL解决乱码问题

    本文将详细介绍如何在Linux环境下配置MySQL,以解决乱码问题,确保中文字符能够被正确地存储、检索和显示。 #### 解决方案步骤详解 1. **编辑MySQL配置文件** 首先,需要编辑MySQL的配置文件`my.cnf`。如果该...

    Mysql 中文乱码 最简单的解决办法

    总结,解决MySQL中文乱码问题的关键在于确保服务器、数据库、表及字段的字符集设置一致,并与数据源保持匹配。在开发和维护过程中,关注字符集的统一性,可以避免很多不必要的编码问题。通过上述步骤,你应该能够...

    让MySql彻底支持中文_解决mysql数据库乱码

    总结来说,确保MySQL彻底支持中文并解决乱码问题,需要从服务器配置、数据库与表的创建、客户端连接以及处理已有数据四个方面进行细致操作。通过正确设置字符集和校对集,可以有效地避免中文乱码问题,实现MySQL对...

    Mysql中文乱码问题完美解决方案

    ### MySQL中文乱码问题及其解决方案 #### 一、问题根源分析 在MySQL中遇到中文乱码问题通常是由于以下几个方面的原因: 1. **Server本身的设定问题**:比如服务器使用的字符集仍为`latin1`(一个仅支持西欧语言的...

    MySQL 5.0.16乱码问题的解决方法

    MySQL 5.0.16 乱码问题的出现通常是由于字符编码不匹配或配置不当导致的,这可能会影响到数据库中的数据存储和显示。解决这个问题需要理解MySQL的字符集和校对设置,以及如何在不同层面进行配置。以下是一系列详细的...

    一次性解决中文乱码问题

    本文将深入探讨中文乱码的成因、解决方案,并为初学者提供一些实用的建议,帮助你们一次性解决这个问题。 首先,我们需要理解什么是乱码。乱码通常发生在计算机系统处理字符编码不一致的情况下,即数据的输入、存储...

    JSP中文乱码问题最优解决方法

    ### JSP中文乱码问题最优解决方法 在Web开发中,特别是使用Java Server Pages(JSP)进行网页设计时,中文乱码问题是一个常见的技术挑战。本文将详细探讨如何有效地解决JSP页面中的中文乱码问题,并提供具体的解决...

    Mysql中文乱码问题完美解决方案宣贯.pdf

    MySQL中的中文乱码问题是一个常见的困扰,特别是在处理中文字符集时。解决这个问题的关键在于理解字符集和校对集的工作原理,以及如何在MySQL服务器、数据库、表和客户端之间正确配置它们。以下是一些详细的解决方案...

    解决jsp中文乱码问题(转)

    本文将详细介绍如何解决JSP页面中出现的中文乱码问题,包括页面显示、表单提交和数据库连接三个主要方面。 一、JSP 页面显示乱码 当JSP页面中的中文无法正常显示时,通常是由于编码格式不匹配导致的。每个网页都有...

    php中常见中文乱码处理方法总结

    ### PHP中常见中文乱码处理方法总结 #### 一、PHP网页的编码 在PHP开发过程中,中文乱码是一个常见的问题。这个问题可能出现在不同的场景中,包括网页本身、与MySQL数据库交互的过程,甚至与操作系统之间的编码不...

    mysql示例数据库(world)_解决中文乱码_使用UTF8字符集

    总结来说,解决MySQL中文乱码问题的关键在于正确设置服务器、数据库、表、列以及客户端的字符集为UTF8。通过以上步骤,你可以在world示例数据库中存储和操作中文数据,而不会遇到乱码问题。记住,字符集的统一和兼容...

    JSP中文乱码问题解决方法.

    以下是一些解决JSP中文乱码问题的关键知识点: 1. **字符编码理解**: - **Unicode**:一种通用的字符编码标准,包含了世界上大部分语言的字符。 - **UTF-8**:最常用的Unicode编码,广泛用于Web应用,支持中文...

    解决MySQL客户端输出窗口显示中文乱码问题的办法

    在使用MySQL数据库时,有时会遇到一个常见的问题,即在MySQL客户端(如MySQL命令行或第三方工具)中查询中文数据时,输出结果显示为乱码。这个问题通常与字符编码设置不匹配有关。本文将深入探讨这个问题的原因及...

    PHP与MySQL Web应用平台中文乱码问题研究.pdf

    在构建PHP与MySQL的Web应用平台时,中文乱码问题是一个常见的困扰。这个问题主要源于字符集的不兼容和转换机制的缺失。字符集是计算机存储和处理文本的基础,特别是对于包含多种语言的环境,如中文,正确选择和配置...

    中文乱码解决方法(已验证).docx

    本文将详细解析中文乱码产生的原因以及针对request和response的解决方案。 一、基础知识 1. 字符编码:GBK是一种兼容GB2312的汉字编码标准,包含GB2312的所有字符,但GB2312编码的数据不一定能正确通过GBK解码。 2....

    史上最全的PHP+MySql中文乱码解决方案.docx

    PHP和MySQL中文乱码问题是一个常见的困扰,尤其是在处理多语言网站或者有中文数据存储需求的项目中。要解决这个问题,我们需要理解编码的概念以及涉及到的各个环节。 首先,编码是指字符集和其对应的数字或二进制...

Global site tag (gtag.js) - Google Analytics