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

MySql条件查询不到数据 → 更改数据库编码

2017-02-14 12:08 495 查看
最近在弄一个后台服务器的时候,出现一个问题。在访问一个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就大功告成了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: