MySQL乱码问题(不要相信mysql的utf8)

MySQL乱码问题(不要相信mysql的utf8)

1.概述

上一次写crud的时候也是遇到了这个问题,当时搞了一个下午还是没有整好,最后妥协下来所有的商品名称全部换为英文名字了😂,没办法啊,谁让这玩意不是中国人发明的,今天往数据库中插入了几条数据之后又出现乱码问题了,出来混迟早要还的

2.问题描述&解决流程

当然我目前还是没有解决问题,一边记录一边解决问题可以及时的跟踪,不然凭借我对自己的了解,问题解决了我就懒得复盘了,而且当初的一些出错截图也就找不到了,我总不能把他弄回原来错误的样子再截图一次吧😂

建表以及数据添加过程我都是在navicat上面进行的,由下图可知,没有问题

image-20200511193422347

但是当使用桌面终端连接数据库并进行查询时:

image-20200511193537655

插入一条带有中文的记录也是不行(你这种排华趋势很危险):

image-20200511193756474

查看表字符编码:show create table user \G;

image-20200511194818948

没问题,charset = utf8,虽然建表时候没有指定,但是我之前应该是在my.ini里面配置过了

在IDEA中也可以进行数据库连接,查看编码:

image-20200511200500938

mysql乱码问题复杂就复杂在有好多的参数,但是我发现为什么两个客户端连接的是同一个数据库但是编码不是完全一样的呢?出现不同的是这三项:

character_set_client

character_set_connection

character_set_results

这三个参数是应该是每个客户端不一样的,当然只是我的猜测

这三个参数的不同之处在于别人是utf8,而他们三个是utf8mb4,这引起了我的注意,他们是一样的东西不?有啥区别?查看网上资料,我看到了一个文章,记住,永远不要在 MySQL 中使用“utf8”,而且按照上面的做法桌面终端乱码问题解决了:

打开my.ini文件(也就是Linux中的my.cnf),将原来设置为utf8的全部改为utf8mb4,重启数据库服务器,重新连接

image-20200511201631324

具体关于utf8mb4这玩意到底怎么回事我一会再总结,上面的文章里面说的比较清楚,直接跳转查看即可,这里就不重复造轮子了,但是问题还是没有全部解决:

项目中我是用的ORM框架是hibernate,用户名输入:

image-20200511202104005

但是后台的查询语句却是这样的:

Hibernate: 
    select
        * 
    from
        user 
    where
        username = '??????'

说明还是存在乱码问题,根据自己的经验,解决乱码问题的做法就是统一编码,那么看来这里编码格式还是不一致的,下面使用debug的方法,看一下是从哪里开始出现乱码的:

在最开始的LoginAction中打一个断点:

image-20200511212232698

数据追踪结果:

image-20200511212433287

我们可以看到,中文到达action时就已经乱码,根本不干MySQL的事啊😓😓

那么接下来查看登录界面以及IDEA的FileCoding,全部已经统一为UTF-8编码,最终的问题出现在浏览器的默认传输编码上面,第一次遇到,这真的是一个大坑,浏览器默认使用的编码格式是iso-8859-1,而我们要进行统一的格式是UTF-8。。。

最后的解决方式是使用String convertName = new String(username.getBytes("iso-8859-1"),"UTF-8");对数据做一个转换,进行重新编码

3.总结

乱码问题还是挺让人糟心的,尤其是mysql乱码,其他的乱码真的没有这个复杂,虽然这篇日志文章还是比较短小,但是中间的尝试过程以及心理活动变化(主要还是一直口吐芬芳)是文字无法体现的,mysql不仅需要考虑数据库编码,还有每一个客户端的,而且使用语句修改下一次就会失效!生效范围只是会话级别的!那就需要去改配置文件,改完配置文件还要滚去资源管理器中重启数据库服务!而且,数据库、表还有字段的编码格式也是可以不统一的!!!我都按照这篇文章进行了一一检查😷

最终的编码格式统一为了这个样式

image-20200511213300389

本文主要作为一篇日志记录,这里有一篇对mysql乱码总结的很好的文章,今后再次遇到乱码问题可以留作备用查看:

再见乱码:5分钟读懂MySQL字符集设置

啊,再见吧,乱码~~~

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://hadoo666.top/archives/mysql乱码问题md