MySQL----MySQL数据库插入中文报错或者乱码问题的解决办法

【原文链接】

一、原因分析

1.1 MySQL5.7版本的数据库和服务端编码默认设置为latin1编码

这个问题在8.0版本的数据库中已经解决了,5.7版本mysql默认的字符集不是utf8导致的
在5.7版本的数据库中执行如下命令

show variables like 'character_%';

如下,可以看到character_set_database 和 character_set_server 的字符集为latin1

而在8.0的数据库中,默认的已经将这个位置修改为utf8了,如下

1.2 MySQL5.7版本的数据库对应的字符串排序编码也设置为latin1编码

查看默认字符串排序的编码的命令

show variables like 'collation_%';

在5.7版本的数据库中结果如下

而在8.0版本的数据库中,此默认配置也已经修改了,如下

二、解决方法

2.1 数据库已经运行,业务要求数据库不能重启的情况下的解决办法

在有些时候,当发生问题的时候很多业务已经上线,数据库已经运行,业务要求数据库不能重启,此时就需要采用临时的解决办法,也就是通过mysql命令行设置,此时需要注意,在mysql中,mysql命令行设置的变量默认范围都是session会话级别的,要想在全局生效,需要加上global,如下:

set global character_set_database=utf8;
set global character_set_server=utf8;
set global collation_database=utf8_general_ci;
set global collation_server=utf8_general_ci;

然后退出当前数据库连接,重新连接登录,再次执行如下命令查看变量

show variables like 'character_%';
show variables like 'collation_%';

如下,此时都已经修改完成,此时再次去插入中文就不会报错了,当然这种解决办法只是一种临时解决办法,也就是数据库如果重启,那么还是会恢复到之前的默认配置,但是这种也能解决的一种场景就是当我们的数据库不允许重启的情况下,那么这种解决办法就很有效了

现在将MySQL重启一下,然后再查结果如下,可以发现确实又恢复了

2.2 彻底的解决办法

通过修改mysql的配置文件,一劳永逸的解决办法。这种解决办法需要重启数据库,因此如果数据库允许重启。那么还是建议使用这种方法解决

在windows上安装的数据库的配置文件名为my.ini,存放MySQL存放数据的目录下,这里比如如下。linux上配置文件名为 my.cnf,一般路径为 /etc/my.cnf

然后编辑my.ini文件,分别在mysql和mysqld下面加如下内容

[mysql]  # 在其下添加如下一行

default-character-set=utf8	#默认字符集

[mysqld] #在其下添加如下两行

character-set-server=utf8
collation-server=utf8_general_ci

如:

然后重启mysql服务即可,linux上通过如下命令重启mysql服务

systemctl restart mysqld

Windows通过【计算机】-右键-【管理】-【服务和应用程序】-【服务】,然后找到【MySQL5.7】,在上面右键-重新启动即可

重新启动后,再次查询编码,可以发现此时已经修改生效了

猜你喜欢

转载自blog.csdn.net/redrose2100/article/details/125028599