`
gg19861207
  • 浏览: 181765 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

最后一次解决mysql中文乱码!!!(

阅读更多

适用于简单的JSP页面之间传递中文,100%好使

String name=new String(roleform.getName().getBytes("ISO-8859-1"),"GB2312");

最简便的方法

配置个spring内置的过滤器:
<filter>
<filter-name>Spring character encoding filter</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>Spring character encoding filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:该过滤器是老大,必须放在所有过滤器的前面

想自找麻烦的看这个
我自己都不知道为了中文问题烦恼了多少个日子,最恨瑞典人了-谁叫他发明了mysql,还设置了默认设置:latin1.曾经也在想假如中国人发明了 mysql(my see狗),呵呵,那么我们还有这样烦恼吗?默认的就是gk2312 或者gbk.倘若考虑到台湾朋友加一个big5.就得了。可是呢?事实不是这样的,没有办法,自己只好baidu一下,google一下,甚至yahoo 一下。能找到的方法都试过了,好久了,直到今天让我找到了,想明白了。所以急切和大家分享以下心得。

为了说的明白一些,我觉个例子:
很简单,就是从html中接受两个输入,然后由jsp处理写到mysql且从数据库返回这个结果显示出来。
Mysql_jstl.html

<html>
<head>
<title>CH14 - Mysql_jstl.html</title>
<meta http-equiv="Content-Type" content="text/html; charset= GB2312">
</head>
<body>

<h2>将信息存入 Mysql 中 - 使用 JSTL 写法</h2>
<form name="form" action="Mysql_jstl.jsp" method="post" >
<p>姓:<input name="last_name" type="text" id="last_name"></p>
<p>名:<input name="first_name" type="text" id="first_name"></p>
<p>
<input type="submit" value="传送">
<input type="reset" value="取消">
</p>
</form>

</body>
</html>




Mysql_jstl.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<html>
<head>
<title>CH14 - Mysql_jstl.jsp</title>
</head>
<body>

<h2>将信息存入 Mysql 中 - 使用 JSTL 写法</h2>

<fmt:requestEncoding value="GB2312" />

<c:set var="birth" value="1978/12/11" />
<c:set var="sex" value="F" />
<c:set var="email" value="aaa@asdf.com" />

<sql:setDataSource driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/sample?useUnicode=true&characterEncoding=UTF-8"
user="root"
password="44444" />

<sql:update>
INSERT INTO employee(employee_id, last_name, first_name, birth, sex, emmail)
VALUES ( ? , ? , ? , ? , ? , ? )

<sql:param value="${employee_id}" />
<sql:param value="${param.last_name}" />
<sql:param value="${param.first_name}" />
<sql:param value="${birth}" />
<sql:param value="${sex}" />
<sql:param value="${email}" />
</sql:update>

<sql:query var="result">
SELECT * FROM employee
</sql:query>

从 employee 取出所有新增的姓名:<br>
<c:forEach items="${result.rows}" var="row" >
新增姓名:<c:out value="${row.last_name}" />
<c:out value="${row.first_name}" /><br>
</c:forEach>

</body>
</html>


接下来就是创建数据库,名字为sample

然后建立一个table: employee,
内容如下(其中应该是email,可是我不小心在建数据库打错了,将错就错了):

+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| employee_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| last_name | varchar(20) | YES | | NULL | |
| first_name | varchar(20) | YES | | NULL | |
| birth | date | YES | | NULL | |
| sex | enum('m','f') | YES | | m | |
| emmail | varchar(39) | YES | | NULL | |
+-------------+------------------+------+-----+---------+----------------+

如果只是这样的话,就会出现这样的错误:报告的错误是:sqle=com.mysql.jdbc.MysqlDataTruncation:
Datatruncation:Datatoolong
forcolumn'last_name'atrow1
.而且select last_name from employee.来看也出现了如下的情况:

| last_name|
+-------------+
|??|
|54243654321|
|??|
|??|
+-------------+

出现问号!

前面我们已经说过了,mysql默认的编码是latin1,不是我们所需要的gbk,所以我们要修改成为utf8,因为若要正确显示中文繁、简、日文、韩文 使用utf8,修改方法如下:
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 ;

接下来要做的是打开mysql所在的目录下的my.nin

在[mysqld]段加入一下代码改成:


default-character-set=utf8

启动mysql,输入:


执行下列语句,看看结果是不是下面的:

mysql> show variables like '%character%';
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_results | latin1 |
| character_set_server | utf8
| character_set_system | utf8 |
| character_sets_dir | C:\MySQL\MySQL Server 5.0\share\charsets\ |
+--------------------------+-------------------------------------------+

mysql> show variables like '%collation%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-------------------+



接着你再看看执行那个Mysql.html 文件:这回你可以看到的是
mysql> select * from employee;
+-------------+-----------+------------+------------+------+--------------+
| employee_id | last_name | first_name | birth | sex | emmail |
+-------------+-----------+------------+------------+------+--------------+
| 12 | ? | ?? | 1978-12-11 | f | aaa@asdf.com |
| 13 | ? | ?? | 1978-12-11 | f | aaa@asdf.com |
| 14 | ? | ?? | 1978-12-11 | f | aaa@asdf.com |
| 15 | ? | ?? | 1978-12-11 | f | aaa@asdf.com |
| 16 | ? | ?? | 1978-12-11 | f | aaa@asdf.com |
| 17 | ? | ?? | 1978-12-11 | f | aaa@asdf.com |
+-------------+-----------+------------+------------+------+--------------+

这当然不是我们希望看到的,我们需要的现实完美正确的中文:
我们还有最后一招:
mysql> SET NAMES 'gbk' ;
Query OK, 0 rows affected (0.00 sec)
因为我们需要的是gbk.
看看mysql中的character设置情况

mysql> SHOW VARIABLES LIKE '%character%' ;
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8 |
| character_set_results | gbk |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\MySQL\MySQL Server 5.0\share\charsets\ |
+--------------------------+-------------------------------------------+
7 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE '%collation%' ;
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | gbk_chinese_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+

这个才是我们最终需要的。
在来查看执行完Mysql_jstl.jsp后的数据库中的结果:
mysql> select * from employee;
| 14 | 王 | 彭给 | 1978-12-11 | f | aaa@asdf.com |
| 15 | 田 | 王光 | 1978-12-11 | f | aaa@asdf.com |
| 16 | 息 | 存入 | 1978-12-11 | f | aaa@asdf.com |
| 17 | 往 | 小杯 | 1978-12-11 | f | aaa@asdf.com |
+-------------+-----------+------------+------------+------+--------------+

可以高兴得看到了中文,并且在浏览器中也显示正确。

但是仅仅这样的话,当你重新启动mysql的时候
所有的设置又失效了。
mysql> show variables like '%character%';
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\MySQL\MySQL Server 5.0\share\charsets\ |
+--------------------------+-------------------------------------------+

mysql> SHOW VARIABLES LIKE '%collation%' ;
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-------------------+
重新读取又出现乱码:
mysql> select * from employee;
+-------------+-----------+------------+------------+--
| employee_id | last_name | first_name | birth | s
+-------------+-----------+------------+------------+--
| 12 | ? | ?? | 1978-12-11 | f
| 13 | ? | ?? | 1978-12-11 | f
| 14 | ? | ?? | 1978-12-11 | f
| 15 | ? | ?? | 1978-12-11 | f
| 16 | ? | ?? | 1978-12-11 | f
| 17 | ? | ?? | 1978-12-11 | f
+-------------+-----------+------------+------------+--
所以我们需要在客户端设置系统能识别中文的编码gbk并没有保存到my.ini文件中。所以要修改my.ini文件
在[mysql]段加入一下代码改成:default-character-set=gbk 这样设置就得到保存了。
重启就可以了。
mysql> show variables like '%character%';
+--------------------------+----------------
| Variable_name | Value
+--------------------------+----------------
| character_set_client | gbk
| character_set_connection | gbk
| character_set_database | utf8
| character_set_results | gbk
| character_set_server | utf8
| character_set_system | utf8
| character_sets_dir | C:\MySQL\MySQL
+--------------------------+----------------
mysql> SHOW VARIABLES LIKE '%collation%' ;
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | gbk_chinese_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
分享到:
评论

相关推荐

    Zabbix中文汉化及出现乱码解决方法

    本文档将详细解释在Zabbix 3.4.6版本中如何进行中文汉化,以及在汉化过程中遇到乱码问题的解决方法。 首先,Zabbix默认是英文界面,如果需要汉化,可以在Zabbix的配置文件中指定语言。进入Zabbix的前端界面,在配置...

    快速进行Access数据库转成mysql数据库及mysql导入中文数据乱码问题的解决方案.pdf

    ### 快速进行Access数据库转成MySQL数据库及解决MySQL导入中文数据乱码问题 #### 一、使用Access-to-MySQL Pro进行Access到MySQL的转换 **1.1 使用Access-to-MySQL Pro的基本步骤** - **步骤1:安装与运行Access-...

    解决Linux下Tomcat向MySQL插入数据中文乱码问题

    本文主要针对的是一个具体的问题:“解决Linux下Tomcat向MySQL插入数据时出现的中文乱码问题”。这个问题通常涉及了多个层面,包括操作系统环境、服务器配置、Web框架以及数据库设置。 首先,问题的背景是在Windows...

    php读取mysql乱码,用set names XXX解决的原理分享

    首先,解决PHP读取MySQL乱码问题是一个在数据库交互中常见的技术挑战。乱码的产生,通常是由于客户端与服务器端字符编码不一致造成的。要解决这种问题,常用的一个方法是使用MySQL的“SET NAMES”命令来声明字符集...

    北邮大三下第4次数据库实验报告--mysql.pdf

    北邮大三下第4次数据库实验报告--mysql.pdf 这个实验报告主要讲述了使用 ODBC 接口访问 MySQL 数据库的...知识点7:中文数据乱码的解决方法 在实验中,为防止中文数据乱码,需要将设置中的编码格式设置为 gb2312。

    最新版appserv和yourphp

    Appserv-win32-2.6.0 (2).exe这个文件名表明这是Appserv的Windows 32位版本,版本号为2.6.0的第二次更新,它通常包含预设配置,只需简单几步就能在本地计算机上启动并运行一个完整的PHP开发环境。 【Yourphp】Your...

    PHP导出MySQL数据到Excel文件(fputcsv)

    接着,我们输出Excel列名,并使用`iconv`函数将UTF-8编码转换为GBK,因为Excel通常使用GBK编码来避免中文乱码。 ```php $fp = fopen('php://output', 'a'); $head = ['姓名', '性别', '年龄', 'Email', '电话', '.....

    zencart繁体中文包 utf-8

    最后,刷新网站,确保所有文本已正确显示为繁体中文。 4. 配置与优化: 为了确保最佳的用户体验,还需要对ZenCart进行一些配置和优化。这包括调整页面布局、设置货币、设定税率、添加支付网关、设置配送选项等。...

    2016PHP面试题

    - **结果**:`mysql_close()`函数默认关闭最后一次打开的连接,因此会关闭`$link2`。 #### 14. mysql_affected_rows()对哪个操作没有影响? - **答案**:`mysql_affected_rows()`用于获取上一条SQL语句影响的行数...

    SpringBoot+Vue图书电子商务网站答辩PPT.pptx

    尽管遇到了诸如中文乱码、数据安全和框架使用等问题,但通过查阅资料、咨询同学和导师,逐步解决了这些问题,提升了问题解决能力和专业技能。 然而,项目尚存在改进空间,如页面设计需增强美学元素,代码需要进一步...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例128 获取数组中最后一个元素 158 实例129 去除数组中的重复元素 158 实例130 字符串与数组的转换 159 实例131 对数组元素进行随机排序 160 实例132 随机抽取数组中元素 161 实例133 二维数组的输出 162 实例134 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例128 获取数组中最后一个元素 158 实例129 去除数组中的重复元素 158 实例130 字符串与数组的转换 159 实例131 对数组元素进行随机排序 160 实例132 随机抽取数组中元素 161 实例133 二维数组的输出 162 实例134 ...

    易语言程序免安装版下载

    修改扩展界面支持库一,禁止透明标签在父窗口刷新时自动刷新,以解决其导致窗口刷新缓冲的问题。 8. 改进应用接口支持库中“设置屏幕分辨率”命令。 9. 修改外部数据库在“表中记录数为零”时可能导致程序崩溃的...

    Java学习笔记

    中文乱码问题是开发过程中常见的问题之一,尤其是在涉及到中文字符输入输出的情况下。以下是一些解决中文乱码的方法: - **设置字符编码**:在连接数据库时指定字符编码,例如`?useUnicode=true&characterEncoding=...

    jpivot学习总结.doc

    menuLabel 否 String 是 如果多次定义 clickable ,那么它将通过一个右键来进行显示,这里的值就是右键菜单的名称。 sessionParam 否 String 是 参数名称,它将会被回写到 ...

    PHP开发实战1200例源码

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则...

Global site tag (gtag.js) - Google Analytics