MySQL中文乱码问题记录

news2025/1/10 2:09:23

概述

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

  • 浏览器(页面)显示乱码,参考记一次中文乱码排查解决流程
  • Linux系统字体缺失导致中文乱码,参考Linux环境下Selenium截图乱码及字体安装及与字符集区别
  • IDEA console控制台乱码,参考IDEA + Tomcat 8.5中文乱码解决过程
  • 数据库中文乱码,
  • CSV/Excel文件中文乱码,参考BOM及CSV/Excel乱码及从代码上根源解决问题

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

问题

一个很简单的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的超集。

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/515198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel突然弹出 请注意!您的文档的部分内容可能包含文档检测器无法删除的个人信息

环境: excel2016 Win10 专业版 问题描述: Excel突然弹出 请注意!您的文档的部分内容可能包含文档检测器无法删除的个人信息 解决方案: 1.打开excel点击左上角的“文件”菜单项 2.依次选择:选项-》信任中心-》信…

(学习日记)2023.5.11

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

【小沐学Python】Python实现Web图表功能(ECharts.js,Flask+Vue)

文章目录 1、简介1.1 Vue1.2 Flask 2、Flask echarts.js Vue2.1 Vue2 (CDN) Vue-ECharts2.2 Vue3 (CDN) Vue-ECharts2.3 Vue3 (npm) Flask / nodejs 3、FAQ3.1 Fatal error in launcher: Unable to create process using "c:\users\tomcat\desktop\flask_english\adm…

【华为HCIP | 高级网络工程师】刷题日记(6)

个人名片: 🐼作者简介:一名大二在校生 🐻‍❄️个人主页:落798. 🐼个人WeChat:落798. 🕊️系列专栏:零基础学java ----- 重识c语言 ---- 计算机网络 🐓每日一…

机器学习工作流程

机器学习的定义机器学习的工作流程获取到的数据集的特性 1、什么是机器学习 机器学习是从数据中自动分析获得模型,并利用模型对未知数据进行预测。 2、机器学习工作流程 机器学习工作流程总结 1、获取数据2、数据基本处理3、特征工程4、机器学习(模型…

Maven POM和Maven构建配置文件操作笔记

目录 我到现在还是没有太搞懂Maven的作用,我只是有一个模糊的概念就是它可以添加很多的依赖,这样会使项目搭建起来更加方便,你可以谈谈你的看法吗? Maven POM 父(Super)POM POM 标签大全详解 Maven 构建…

【云原生】Kubeadm部署k8s

【云原生】-- Kubeadm部署k8s 一、部署步骤二、部署kubernetes1、所有节点关闭防火墙 核心防护 iptables规则 swap交换2、修改主机名3、调整内核参数 三、安装Docker1、所有节点安装docker2、所有节点配置Kubernetes源3、所有节点安装kubeadm,kubelet和kubectl 四、…

【Java】抽象类与接口

文章目录 1.抽象类1.1抽象方法 2.接口3.抽象类和接口的区别3.1代码中区分:3.2设计层面区分 在面向对象编程中,抽象是非常重要的一个特征。在Java中可以通过抽象类或接口的形式实现这一特性。 1.抽象类 Java关键字 abstract对应抽象类的使用 1.1抽象方法…

【快速排序】

快速排序 递归法 1、快排 快速排序算法使基于分治策略的一个排序算法,其基本思想是,对于输入的子数组 nums[left : right] 按以下3个步骤排序: (1)分解:以 nums[left] 为基准元素将 nums[left : right] …

Wisej.NET 3.2 WiseJ Framework Crack

Web Development for Business Applications build ›› migrate ›› modernize ›› See the amazing things people are doing with Wisej.NET Customer storiesmadewithWisej.com Wisej 3.2 is released! read more ›› Wisej.NET Rapid .NET Web Development - 3.2 beta …

【深度学习】第一门课 神经网络和深度学习 Week 1 深度学习概论

文章目录 目录 目录 文章目录 1.1 欢迎来到深度学习 1. 为什么要学深度学习? 2. 我们将学习到哪些内容? 1.2 什么是神经网络? 引例 问题 题解 抽象 复杂化问题 建模 1.3 用神经网络进行监督学习 1. 概念辨析 2. 用神经网络进…

Hive 实战第一讲 hive基本介绍以及环境搭建

文章目录 1.Hive介绍1.1 hive 基本情况1.2 Hive架构原理1.3 Hive 安装1.4 元数据配置1.5 hive 服务部署1.6Hive常用交互命令1.6.1 Hive参数配置方式 1.Hive介绍 1.1 hive 基本情况 hive基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表。 Hive是…

程序员必备的工具网站,大幅度提升你的工作效率

前言: 相信很多人不光是在编程的过程中,在平时的生活中,也经常会收藏一些有用的网站,方便使用的时候,靠这些网站来解决一些麻烦的事情。 我就把我收藏的一些经常用的工具网站分享给你们,你们也可以收藏起来…

web网络安全

在学习网络安全之前,必须要先知道一个组织——OWASP。 OWASP是一个开源的、非盈利的全球性安全组织,致力于应用软件的安全研究。我们基于该组织公布的技术文档来学习相关网络攻击原理和预防措施,web安全的核心是——永远不要相信用户传过来的…

OLED显示实验

实验内容 点亮OLED,并实现ASCII 字符的显示。 OLED简介 OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD&#xff09…

Java10

Java10 (一)、配置文件(二)、多线程2.1 并发和并行2.2 多线程的实现方式2.3 常见成员方法2.3.1 线程的优先级2.3.2 守护线程(备胎线程)2.3.3 礼让线程和插入线程 2.4 线程生命周期2.4 线程安全问题2.5 锁2.…

Android Input kl文件实现键值映射

Android Keyevent定义在KeyEvent.java 截图对应 public static final int KEYCODE_SYSRQ 120; adb shell input keyevent SYSRQLinux Scancode定义在input-event-codes.h #define KEY_SCALE 120可以看到是不对应的 本来想通过指纹双击实现截图功能,发现上报scanco…

浅谈性能测试策略的理解

面对日益复杂的业务场景和不同的系统架构,前期的需求分析和准备工作,需要耗费很多的时间。而不同的测试策略,也对我们的测试结果是否符合预期目标至关重要。 这篇博客,聊聊我个人对常见的性能测试策略的理解,以及它们…

tkinter+爬虫(re库,tkinter库详解)

1.安装和认识本次实验所需要的库 re库(正则库,本次实验用于匹配文本) tkinter库 (GUI库,用于制作可视化界面) requests库 (网络请求库,用于制作爬虫) re和tkinter均为…

node 脚本调试

Node 脚本调试 node --inspect-brk index.js 执行以上命令,然后打开浏览器的控制台会发现有个node的logo 点击这个图标就可以开始调试代码 调试webpack 只需要找到webpack的执行入口,然后执行以下命令,只要是node脚本都可以进行调试。 n…