最近在弄一个后台服务器的时候,出现一个问题。在访问一个servlet的时候,怎么都不给我返回数据,于是打开服务器代码追查原因,里面很简单的代码,只是一些很简单的逻辑,再有就是对数据库MySql的条件查询。只不过条件值是汉字,语句如下:
select * from student where name='小明';
然而通过Navicat premium查看该表是存在小明这个同学的。
通过Navicat premium执行SQL语句也是可以查到的。
这时我就晕了,都能查到,为什么代码里面就不行了。
先冷静一下,问题可能出在两个地方:代码有问题、数据库可能存在问。
还是先找代码,找了半天也没发现问题。于是只能追查数据库了,我使用命令行模式打开数据库,将SQL语句复制到命令行查询
C:\Users\Administrator>mysql -u root -p
Enter password: ******
mysql> use test
Database changed
mysql> select * from student where name='小明';
Empty set (0.00 sec)
结果通过以上的语句还是没能查出对应的数据,那就能把问题锁定了,问题肯定出在数据库。
再通过查询student表的所有内容:
mysql> select * from student;
+------+------+----+
| name | age | id |
+------+------+----+
| ?? | 12 | 1 |
| ?? | 13 | 2 |
+------+------+----+
2 rows in set (0.00 sec)
通过上面的查询,问题找到了,原来是乱码了。先不管那么多查看下该数据库的编码
mysql> use test //切换到test数据库
Database changed
mysql> show variables like 'character_set_database'; //查看当前数据库的字符编码
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| character_set_database | latin1 |
+------------------------+--------+
1 row in set (0.00 sec)
这里我们可以看到是latin1编码,那就把这个编码该成utf-8的;
mysql> alter database test CHARACTER SET utf8; //将test数据库编码修改为utf8
Query OK, 1 row affected (0.00 sec)
mysql> show variables like 'character_set_database';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| character_set_database | utf8 |
+------------------------+-------+
1 row in set (0.00 sec)
好了,修改成功。也可以通过Navicat premium 右键点击test数据库–>数据库属性 进行查看和编辑。
修改完成,查看一下效果。结果还是发生乱码。再看下数据库的编码,是不是安装的时候手快把编码搞错了。那么先看下数据库的编码
mysql> status;
--------------
mysql Ver 14.12 Distrib 5.0.18, for Win32 (ia32)
Connection id: 3
Current database: test
Current user: root@localhost
SSL: Not in use
Using delimiter: ;
Server version: 5.0.18-nt
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: latin1 /* 编码有问题 */
Db characterset: utf8
Client characterset: latin1 /* 编码有问题 */
Conn. characterset: latin1
TCP port: 3306
Uptime: 6 min 33 sec
通过上面的信息可以看到 Server 、Client 、Conn. 编码方式都有问题。
打开mysql的安装目录,找到my.ini文件修改default-character-set=latin1为default-character-set=utf8
再查看一下编码
mysql> status
--------------
mysql Ver 14.12 Distrib 5.0.18, for Win32 (ia32)
Connection id: 1
Current database: test
Current user: root@localhost
SSL: Not in use
Using delimiter: ;
Server version: 5.0.18-nt
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: latin1 /* 编码有问题 */
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 56 sec
可以看到只有Server,那我们在查看一下数据库
mysql> select * from student;
+--------+------+----+
| name | age | id |
+--------+------+----+
| 灏忔槑 | 12 | 1 |
| 灏忚姳 | 13 | 2 |
| 灏忓垰 | 14 | 3 |
+--------+------+----+
3 rows in set (0.02 sec)
还是乱码,只是没有出现问号了,那我们就再改下Server编码,下面有两种方法更改:
1.在[mysqld]的段中加上一句:character_set_server=utf8 –> 重启服务
2.运行 安装目录\bin下面的MySQLInstanceConfig.exe重新配置
完成上面的操作,再通过访问上面的servlet就大功告成了。