您的位置:首页 > 数据库 > MySQL

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

2009-08-25 16:20 134 查看
适用于简单的JSP页面之间传递中文,100%好使Stringname=newString(roleform.getName().getBytes("ISO-8859-1"),"GB2312");最简便的方法
配置个spring内置的过滤器:
<filter>
<filter-name>Springcharacterencodingfilter</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>Springcharacterencodingfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:该过滤器是老大,必须放在所有过滤器的前面
想自找麻烦的看这个我自己都不知道为了中文问题烦恼了多少个日子,最恨瑞典人了-谁叫他发明了mysql,还设置了默认设置:latin1.曾经也在想假如中国人发明了mysql(mysee狗),呵呵,那么我们还有这样烦恼吗?默认的就是gk2312或者gbk.倘若考虑到台湾朋友加一个big5.就得了。可是呢?事实不是这样的,没有办法,自己只好baidu一下,google一下,甚至yahoo一下。能找到的方法都试过了,好久了,直到今天让我找到了,想明白了。所以急切和大家分享以下心得。为了说的明白一些,我觉个例子:很简单,就是从html中接受两个输入,然后由jsp处理写到mysql且从数据库返回这个结果显示出来。Mysql_jstl.html
<html><head><title>CH14-Mysql_jstl.html</title><metahttp-equiv="Content-Type"content="text/html;charset=GB2312"></head><body><h2>将信息存入Mysql中-使用JSTL写法</h2><formname="form"action="Mysql_jstl.jsp"method="post"><p>姓:<inputname="last_name"type="text"id="last_name"></p><p>名:<inputname="first_name"type="text"id="first_name"></p><p><inputtype="submit"value="传送"><inputtype="reset"value="取消"></p></form></body></html>
Mysql_jstl.jsp
<%@pagecontentType="text/html;charset=GB2312"%><%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><%@taglibprefix="sql"uri="http://java.sun.com/jsp/jstl/sql"%><%@taglibprefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt"%><html><head><title>CH14-Mysql_jstl.jsp</title></head><body><h2>将信息存入Mysql中-使用JSTL写法</h2><fmt:requestEncodingvalue="GB2312"/><c:setvar="birth"value="1978/12/11"/><c:setvar="sex"value="F"/><c:setvar="email"value="aaa@asdf.com"/><sql:setDataSourcedriver="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/sample?useUnicode=true&characterEncoding=UTF-8"user="root"password="44444"/><sql:update>INSERTINTOemployee(employee_id,last_name,first_name,birth,sex,emmail)VALUES(?,?,?,?,?,?)<sql:paramvalue="${employee_id}"/><sql:paramvalue="${param.last_name}"/><sql:paramvalue="${param.first_name}"/><sql:paramvalue="${birth}"/><sql:paramvalue="${sex}"/><sql:paramvalue="${email}"/></sql:update><sql:queryvar="result">SELECT*FROMemployee</sql:query>从employee取出所有新增的姓名:<br><c:forEachitems="${result.rows}"var="row">新增姓名:<c:outvalue="${row.last_name}"/><c:outvalue="${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:Datatoolongforcolumn'last_name'atrow1.而且selectlast_namefromemployee.来看也出现了如下的情况:|last_name|+-------------+|??||54243654321||??||??|+-------------+出现问号!前面我们已经说过了,mysql默认的编码是latin1,不是我们所需要的gbk,所以我们要修改成为utf8,因为若要正确显示中文繁、简、日文、韩文使用utf8,修改方法如下:ALTERDATABASEsample####这里修改整个数据库的编码CHARACTERSETutf8DEFAULTCHARACTERSETutf8COLLATEutf8_general_ciDEFAULTCOLLATEutf8_general_ci;当然了,你也可在在建数据库的时候指定编码,比如:CREATEDATABASEsampleCHARACTERSETutf8DEFAULTCHARACTERSETutf8COLLATEutf8_general_ciDEFAULTCOLLATEutf8_general_ci;接下来要做的是打开mysql所在的目录下的my.nin
在[mysqld]段加入一下代码改成:default-character-set=utf8启动mysql,输入:执行下列语句,看看结果是不是下面的:mysql>showvariableslike'%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/MySQLServer5.0/share/charsets/|+--------------------------+-------------------------------------------+mysql>showvariableslike'%collation%';+----------------------+-------------------+|Variable_name|Value|+----------------------+-------------------+|collation_connection|latin1_swedish_ci||collation_database|utf8_general_ci||collation_server|utf8_general_ci|+----------------------+-------------------+
接着你再看看执行那个Mysql.html文件:这回你可以看到的是mysql>select*fromemployee;+-------------+-----------+------------+------------+------+--------------+|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>SETNAMES'gbk';QueryOK,0rowsaffected(0.00sec)因为我们需要的是gbk.看看mysql中的character设置情况:mysql>SHOWVARIABLESLIKE'%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/MySQLServer5.0/share/charsets/|+--------------------------+-------------------------------------------+7rowsinset(0.00sec)mysql>SHOWVARIABLESLIKE'%collation%';+----------------------+-----------------+|Variable_name|Value|+----------------------+-----------------+|collation_connection|gbk_chinese_ci||collation_database|utf8_general_ci||collation_server|utf8_general_ci|+----------------------+-----------------+这个才是我们最终需要的。在来查看执行完Mysql_jstl.jsp后的数据库中的结果:mysql>select*fromemployee;|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>showvariableslike'%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/MySQLServer5.0/share/charsets/|+--------------------------+-------------------------------------------+mysql>SHOWVARIABLESLIKE'%collation%';+----------------------+-------------------+|Variable_name|Value|+----------------------+-------------------+|collation_connection|latin1_swedish_ci||collation_database|utf8_general_ci||collation_server|utf8_general_ci|+----------------------+-------------------+重新读取又出现乱码:mysql>select*fromemployee;+-------------+-----------+------------+------------+--|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>showvariableslike'%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>SHOWVARIABLESLIKE'%collation%';+----------------------+-----------------+|Variable_name|Value|+----------------------+-----------------+|collation_connection|gbk_chinese_ci||collation_database|utf8_general_ci||collation_server|utf8_general_ci|
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: