- request.setCharacterEncoding("gbk");
页面显示时,却提示出错信息:“帐号或密码错误”,而控制台打印的信息不是乱码。这样,我就更加肯定是数据库中的字符集有问题了。于是,我将MySQL安装目录下的文件my.ini中的
- default-character-set=latin1
改为了
- default-character-set=gbk
测试之后,还是乱码。然后,我就想测试下:JSP提交的信息插入到数据库中,是否会出现乱码。(都是针对输入中文而言)。果不其然,插到数据库中的信息全是乱码,而且之前在MySQL平台下输入的中文字符也变成了乱码,害得我又将其改回去了。改回去之后,之前在MySQL中输入的中文字符正常,而通过JSP页面提交的中文数据却是乱码,哎,就改这个my.ini文件,都折腾了我很久。后面,都有重新安装mySQL的冲动,但是,我又想,重装mySQL如果没有修改什么,那也没什么区别,况且,像数据库乱码现象,别人肯定遇到过,那就肯定有解决的办法。我就静下心来,到网上查了相关的资料。
于是,我用
- mysql> status;
指令,查看数据库中的字符编码:显示的是:
- Server characterset: latin1
- Db characterset: latin1
- Client characterset: latin1
- Conn. characterset: latin1
这样,答案就很明显了,JSP页面编码和解码都是采用gbk,而数据库连接,以及服务器,客户端,数据库本身都是采用latin1编码的,那JSP提交数据到数据库中肯定会出现乱码。那肯定要将数据库中的编码都要设为gbk
- mysql>SET character_set_Client =gbk;
- mysql>SET character_set_Server =gbk;
- mysql>SET character_set_Connection =gbk;
- mysql>SET character_set_Database=gbk;
我又执行了
- mysql> status;
这时显示的是:
- Server characterset: gbk
- Db characterset: gbk
- Client characterset: gbk
- Conn. characterset: gbk
然后,我又执行了
- mysql> show variables like 'collation_%';
显示的是:
- +----------------------+----------------+
- | Variable_name | Value |
- +----------------------+----------------+
- | collation_connection | gbk_chinese_ci |
- | collation_database | gbk_chinese_ci |
- | collation_server | gbk_chinese_ci |
- +----------------------+----------------+
当时,以为这样设置就好了,执行了下程序:可是又出现了新的错误:
- java.sql.SQLException: Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '='
意思是:我数据库中存在两种字符编码,我觉得纳闷了:将编码设为了:gbk,为什么还会有latin1呢?而且我还将我要操作的那个表的编码也设为了gbk编码:
- ALTER TABLE userinfo CONVERT TO CHARACTER SET gbk;
那为什么会出现Latin1编码呢?然后,我查了下表中各字段的编码:
- show full columns from userinfo;
显示的是:
- +-------+-------------+-------------------+------+-----+---------+--------------
- --+---------------------------------+---------+
- | Field | Type | Collation | Null | Key | Default | Extra
- | Privileges | Comment |
- +-------+-------------+-------------------+------+-----+---------+--------------
- --+---------------------------------+---------+
- | id | int(11) | NULL | NO | PRI | NULL | auto_incremen
- t | select,insert,update,references | |
- | name | varchar(20) | latin1_swedish_ci | YES | | NULL |
- | select,insert,update,references | |
- | pwd | varchar(20) | latin1_swedish_ci | YES | | NULL |
- | select,insert,update,references | |
- +-------+-------------+-------------------+------+-----+---------+--------------
- --+---------------------------------+---------+
从中可以看出我表中字段的编码却是latin1,所以,只要修改表中字段的编码就可以了,但是,我查了网上的资料,按着上面输入:
- ALTER TABLE `userinfo` CHANGE `name` `name` VARCHAR( 20 ) CHARACTER SET gbk NOT NULL
但是,却老是报
- ERROR 1366 (HY000): Incorrect string value: '\xD0\xA1\xD2\xE4' for column 'name'
- at row 1
这种错误,我也不清楚为什么?后面重新建了一个表:在建表时,就设定了表中字段的编码:
- create table userInfo2(
- id int not null auto_increment,
- name varchar(20) ,
- pwd varchar(20),
- primary key(id)
- )type=myisam character set gbk collate gbk_chinese_ci;
然后向该表中插入数据都没有出现乱码现象,不管是在mySQL平台上,还是通过JSP页面提交的数据,而且,另一个JSP页面显示数据库中的信息也不是乱码。