MySQL编码不一致导致查询结果为空

升级数据库后(5.1到8.0),发现一个奇怪的问题,某些页面在升级前可以正常查询,但升级后什么也查不出来了,有时候还会查出错误的结果。经过一整天的排查,终于发现由两个原因导致,现记录如下。

第一是数据库的编码。使用中文关键字查不出结果(或结果错误),但是英文关键字可以正常查询。

还原数据库后默认的编码不是utf-8。执行下面命令可以查看当前数据库编码。

show variables like 'collation%';

或者

show variables like '%character%';

修改编码的语句

set character_set_client=utf8
set character_set_connection=utf8
set character_set_database=utf8
set character_set_results=utf8
set character_set_server=utf8

但是重启MySQL服务后,再查看数据库的编码,发现又变回了原来的。

原来使用命令行设置只是在当前会话中有效,当重启数据库后就会恢复默认编码。因此应该在MySQL的配置文件my.ini中设置。

低版本MySQL的my.ini在安装路径下可以找到,但是8.0的版本存放在C:ProgramDataMySQLMySQL Server 8.0下,这是一个隐藏的文件夹

打开my.ini后,加入如下配置

[mysql]
default-character-set=utf8
[mysqld]
character_set_server=utf8 
collation_server=utf8_general_ci 

修改后重启MySQL服务,发现编码已经成功修改

第二种原因是因为新版本MySQL的关键字导致

数据库的表中有个字段为virtual,在8.0中是虚拟列的关键字。

因此要在查询中加上``避免和关键字重复

其他的关键字Name、Class等没有问题。

原文地址:https://www.cnblogs.com/yaotome/p/10622986.html