数据库以及JSP页面乱码问题的处理

数据库中和JSP页面中中文显示乱码问题,纠结了我很久。令我兴奋的是,现在已经解决了。刚开始测试时,因为我是在MySQL那个黑框框里面中插入中文数据的,所以没有出现乱码。然而,当我用JSP页面去测试时,情况就不同了。我编写的JSP页面的功能很简单,当输入的用户名和密码都正确时,则将数据库中所以用户的信息用表格显示出来,反之,则提示出错信息。刚开始,我没测试向数据库中插入数据,而是用户名和密码登录,当我输入中文时,到数据库中查找时,查找成功了,但是显示到JSP页面上的信息却是乱码。当时,我觉得很奇怪,数据库中有该用户名,而且查找也成功了,为什么显示的却是乱码。然后,我就在向数据库中查询用户名和密码的方法中,打印了提交的用户名和密码,控制台输出的却是乱码。于是,我就想:提交的是乱码为什么能与数据库中显示的不是乱码的中文能够匹配,觉得可能是数据库中的字符编码有问题?后面,我在Servlet类里添加了一条语句:
Java代码   收藏代码
  1. request.setCharacterEncoding("gbk");   

  页面显示时,却提示出错信息:“帐号或密码错误”,而控制台打印的信息不是乱码。这样,我就更加肯定是数据库中的字符集有问题了。于是,我将MySQL安装目录下的文件my.ini中的

Java代码   收藏代码
  1. default-character-set=latin1   

 改为了

Java代码   收藏代码
  1. default-character-set=gbk   

 

 测试之后,还是乱码。然后,我就想测试下:JSP提交的信息插入到数据库中,是否会出现乱码。(都是针对输入中文而言)。果不其然,插到数据库中的信息全是乱码,而且之前在MySQL平台下输入的中文字符也变成了乱码,害得我又将其改回去了。改回去之后,之前在MySQL中输入的中文字符正常,而通过JSP页面提交的中文数据却是乱码,哎,就改这个my.ini文件,都折腾了我很久。后面,都有重新安装mySQL的冲动,但是,我又想,重装mySQL如果没有修改什么,那也没什么区别,况且,像数据库乱码现象,别人肯定遇到过,那就肯定有解决的办法。我就静下心来,到网上查了相关的资料。

     于是,我用

Java代码   收藏代码
  1. mysql> status;  

 指令,查看数据库中的字符编码:显示的是:

Java代码   收藏代码
  1. Server characterset: latin1  
  2. Db characterset: latin1  
  3. Client characterset: latin1   
  4. Conn. characterset: latin1   

 

 这样,答案就很明显了,JSP页面编码和解码都是采用gbk,而数据库连接,以及服务器,客户端,数据库本身都是采用latin1编码的,那JSP提交数据到数据库中肯定会出现乱码。那肯定要将数据库中的编码都要设为gbk

 

 

 

 

 

Java代码   收藏代码
  1. mysql>SET character_set_Client =gbk;   
  2. mysql>SET character_set_Server =gbk;   
  3. mysql>SET character_set_Connection =gbk;  
  4. mysql>SET character_set_Database=gbk;  

 

 我又执行了 

Java代码   收藏代码
  1. mysql> status;  

  这时显示的是:

Java代码   收藏代码
  1. Server characterset: gbk   
  2. Db characterset: gbk   
  3. Client characterset: gbk  
  4. Conn. characterset: gbk   

 然后,我又执行了

Java代码   收藏代码
  1. mysql> show variables like 'collation_%';  

 

 显示的是:

Java代码   收藏代码
  1. +----------------------+----------------+  
  2. | Variable_name        | Value          |  
  3. +----------------------+----------------+  
  4. | collation_connection | gbk_chinese_ci |  
  5. | collation_database   | gbk_chinese_ci |  
  6. | collation_server     | gbk_chinese_ci |  
  7. +----------------------+----------------+  

 

 当时,以为这样设置就好了,执行了下程序:可是又出现了新的错误:

Java代码   收藏代码
  1. java.sql.SQLException: Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '='  

 

意思是:我数据库中存在两种字符编码,我觉得纳闷了:将编码设为了:gbk,为什么还会有latin1呢?而且我还将我要操作的那个表的编码也设为了gbk编码:

Java代码   收藏代码
  1. ALTER   TABLE userinfo   CONVERT   TO   CHARACTER   SET   gbk;   

 那为什么会出现Latin1编码呢?然后,我查了下表中各字段的编码:

Java代码   收藏代码
  1. show full columns from userinfo;  

 显示的是:

Java代码   收藏代码
  1. +-------+-------------+-------------------+------+-----+---------+--------------  
  2. --+---------------------------------+---------+  
  3. | Field | Type        | Collation         | Null | Key | Default | Extra  
  4.   | Privileges                      | Comment |  
  5. +-------+-------------+-------------------+------+-----+---------+--------------  
  6. --+---------------------------------+---------+  
  7. | id    | int(11)     | NULL              | NO   | PRI | NULL    | auto_incremen  
  8. t | select,insert,update,references |         |  
  9. | name  | varchar(20) | latin1_swedish_ci | YES  |     | NULL    |  
  10.   | select,insert,update,references |         |  
  11. | pwd   | varchar(20) | latin1_swedish_ci | YES  |     | NULL    |  
  12.   | select,insert,update,references |         |  
  13. +-------+-------------+-------------------+------+-----+---------+--------------  
  14. --+---------------------------------+---------+  

 

从中可以看出我表中字段的编码却是latin1,所以,只要修改表中字段的编码就可以了,但是,我查了网上的资料,按着上面输入:

Java代码   收藏代码
  1. ALTER   TABLE   `userinfo`     CHANGE   `name`   `name`   VARCHAR(   20   )   CHARACTER   SET   gbk   NOT   NULL  

 但是,却老是报

Java代码   收藏代码
  1. ERROR 1366 (HY000): Incorrect string value: '\xD0\xA1\xD2\xE4' for column 'name'  
  2.  at row 1  

 这种错误,我也不清楚为什么?后面重新建了一个表:在建表时,就设定了表中字段的编码:

Java代码   收藏代码
  1. create table userInfo2(  
  2. id int not null auto_increment,  
  3. name varchar(20) ,  
  4. pwd varchar(20),  
  5. primary key(id)  
  6. )type=myisam character set gbk collate gbk_chinese_ci;  

 然后向该表中插入数据都没有出现乱码现象,不管是在mySQL平台上,还是通过JSP页面提交的数据,而且,另一个JSP页面显示数据库中的信息也不是乱码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值