MySQL中文乱码问题记录

文章描述了一次在编程中遇到的数据库中文乱码问题的排查过程。问题源于数据库的character_set_server设置为latin1,而Java应用程序通过JDBC连接时未指定characterEncoding。解决方案是在JDBC连接字符串中添加useUnicode=true&characterEncoding=UTF-8参数,从而确保数据正确编码。
摘要由CSDN通过智能技术生成

概述

中文乱码是我们日常编程开发中经常会遇到的问题,包括:

本文就是一次数据库中文乱码问题记录。

问题

一个很简单的CRUD接口,Postman模拟接口前端传参JSON如下(省略其他字段):

{
    "companyName": "以邑妈测试的公司"
}

接口自是请求成功,去DataGrip里查看一下数据库,发现乱码:
在这里插入图片描述
8个英文?符号,正好对应以邑妈测试的公司中文字符长度。

注,这个表是业务开发时,新增的表。

排查

首先检查当前数据库,其他表里也有中文信息,没有乱码。发现同一个数据库下另一个表结构定义语句如下(省略其他无关信息):

comment '信息表' charset = utf8mb4;

charset

理论上,表结构默认就是UTF-8编码,utf8mb4是UTF-8的增强版。也就是说,这个表结构编码定义可加可不加。

问题已经发生,在不知道解决方案时,总是会如盲头苍蝇诸般尝试。于是修改数据表编码

alter table merchant_app convert to character set utf8mb4;

不行,还是乱码!

character_set

Google搜索,看了不下5篇文档,都说和character_set有关。于是查询字符集:

show variables like '%char%';

输出:

Variable_nameValue
character_set_clientutf8mb4
character_set_connectionutf8mb4
character_set_databaseutf8
character_set_filesystembinary
character_set_resultsutf8mb4
character_set_serverlatin1
character_set_systemutf8
character_sets_dir/usr/share/mysql/charsets/

其中character_set_server=latin1看起来就是问题所在。

但是:数据库是已经安装并配置好,是不是最优配置,此时讨论意义不大;数据库不是只有我新增的这一个表,其他表可以正常存储中文数据。

所以绝大多数文章推荐的解决方案:修改MySQL全局配置文件my.ini里的character_set_server=utf8配置项,并重启数据库,就显得有些无厘头。如果是自己本机安装的数据库,搭建本地demo测试项目,出现中文乱码,我们可以放心大胆修改全局配置,并重启数据库。

DataGrip

考虑到上面的中文乱码是Java应用程序通过mysql-connector-java JDBC驱动连接数据库,通过socket提交SQL时才会出现中文乱码。

那我在DataGrip客户端执行提交SQL试试呢?

UPDATE merchant_app SET company_name = '中文' WHERE id = 1;

结果:
在这里插入图片描述
是正常的!没有乱码!!貌似看到希望的曙光。

此时我们再去看看DataGrip的DataSource配置详情看看,在General里URL平平无奇,指定IP和端口。
在这里插入图片描述
进一步查看Advanced便签页:
在这里插入图片描述
也就是说DataGrip默认帮我们在URL里增加characterEncoding=UTF-8配置信息。

如果手动修改这个配置项,也就是上面那个character_set_server=latin1
在这里插入图片描述
此时再次执行上面的SQL:

UPDATE merchant_app SET company_name = '中文' WHERE id = 1;

结果:
在这里插入图片描述

结论

修改JDBC connection String,这个配置在yml文件里。之前使用的是jdbc:mysql://10.20.30.40:3306/user,更新为jdbc:mysql://10.20.30.40:3306/user?useUnicode=true&characterEncoding=UTF-8,即可解决问题。

拓展

安装

DBA在安装好MySQL数据库后,需要做一些配置,其中就包括设置character_set_server=utf8character_set_server=utf8mb4。如果有这项配置,在Java应用程序里连接MySQL数据库,即,在Client端连接时,就不需要显式指定characterEncoding=UTF-8,因为此时有MySQL Server端的character_set_server配置给予保证不会出现中文乱码。

如果Server端没有做好调优(事实上,这个算是基础配置,还谈不上调优配置)配置,那就必须在Client端加上characterEncoding配置。

UTF-8 & utf8mb4

MySQL 5.5.3后增加utf8mb4编码,mb4即most bytes 4,用于兼容四字节的unicode。utf8mb4是utf8的超集。

参考

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

johnny233

晚饭能不能加鸡腿就靠你了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值