MySQL 字符集与乱码与collation设置的问题?

news2024/11/29 10:40:50

3cddfdf01df2f91085015fbf1ee23c2a.png

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共1460人左右 1 + 2 + 3 + 4) 3群突破 460已关闭自由申请如需加入请提前说明,新人会进4群(130),另欢迎 OpenGauss 的技术人员加如入。

问题是这样的,最近有同学问关于MySQL 的字符乱码的问题,说从一个数据库到另一个数据库,配置相同,但是为什么这个数据库的中文就是中文,到另一个数据库就是乱码?

说到这个问题,我们先对MySQL的字符集的配置部分进行一个系统化的分析,这里我们那下面的这些配置来详细的说说字符和字符乱码的问题

character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8mb4
character_set_system utf8mb3

character_set_client 这里官方的解释是,客户端发送的语句时所用的字符集,这里的意思就是MySQL 或类MySQL的数据库产品,会认为在接受到客户端的发来的信息后,客户端的编码是 utf8mb4 .

同时MySQL如何处理这些发来的数据要用 character_set_connection 中设置的通过character_set_connection 中设置的字符集来进行数据的处理,最后character_set_results 是最后一个环节,在数据处理完毕后,将数据返回给客户端的字符集编码。

character_set_database

character_set_server

character_set_system 

剩下的三个主要 character_set_database 参数控制了数据库的默认的字符集合,character_set_server 为数据库服务器启动时的默认字符集编码,character_set_system 则是这里唯一的一个变量,他为数据库系统所在的操作系统的字符集这个是无法进行设置的,他与操作系统当前的字符集有关。

那么什么情况会导致输入的数据的字符到了数据库里面是错误的

案例1  

JDBC中使用的指定的字符集不对,导致MySQL接受到的数据与预设客户的字符集不对,导致的乱码。这里需要注意,在JDBC URL中需要使用connector/J 8.020 后的JDBC 才能支持utf8mb4 ,否则只能支持到utf8。

同理当character_set_results的字符集和JDBC的应用字符集设置的不同,也会导致传回应用的字符是乱码的情况。

String url = "jdbc:mysql://127.0.0.1:3306/shop?useUnicode=true&characterEncoding=utf8mb4&autoReconnect=true&allowMultiQueries=true";

所以必须去确认JDBC 设置的字符集和你的MySQL的 character_set_client 和 character_set_result 的字符集是一致的。这里稍微模拟一下,character_set_result 和 character_set_client 的字符集不一致导致的乱码的问题。 

mysql> select * from test;
+----+--------+--------+
| id | name   | title  |
+----+--------+--------+
|  1 | 小李 | 嘩蠧 |
|  2 | 小李 | 嘩蠧 |
+----+--------+--------+
2 rows in set (0.00 sec)

mysql> set character_set_results = 'big5';
Query OK, 0 rows affected (0.00 sec)

mysql> 
mysql> 
mysql> 
mysql>  insert into test (name,title) values ('小李','嘩蠧');
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> 
mysql> select * from test;
+----+-------+-------+
| id | name  | title |
+----+-------+-------+
|  1 | ?ʡ剠| ???   |
|  2 | ?ʡ剠| ???   |
|  3 | ?ʡ剠| ???   |
+----+-------+-------+
3 rows in set (0.00 sec)

所以在此基础上,需要正确设置这些参数,保证数据库和客户端在字符集设置上是一致的。

说完字符集,下面的说说字符比较规则的问题,字符在进行数据处理中需要进行时间,collation_connection 是MySQL服务器的一个系统变量,用于指定当前连接字符比较的规则,字符比较规则包含字符集和校对规则,决定了在执行字符比较和排序时要使用的规则,我们可以通过show varaibles like '%coll%' 来调取当前与collation有关的值。

collation_connection utf8mb4_0900_ai_ci
collation_database utf8mb4_general_ci
collation_server utf8mb4_general_ci
default_collation_for_utf8mb4 utf8mb4_0900_ai_ci

default_collation_for_utf8mb4 是默认数据库和表创建是的校对规则,另外需要注意的校对规则在数据库建立后,不能随意改变,这将产生与应用程序预想的一些业务处理逻辑相悖的结果。

我们举一个简单的例子

mysql> 
mysql> show variables like 'coll%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_0900_ai_ci |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

mysql> select 'a' = 'A';
+-----------+
| 'a' = 'A' |
+-----------+
|         1 |
+-----------+
1 row in set (0.01 sec)

mysql> set collation_connection = utf8_bin;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select 'a' = 'A';
+-----------+
| 'a' = 'A' |
+-----------+
|         0 |
+-----------+
1 row in set (0.00 sec)

mysql>

最后总结MySQL 的字符集和字符排序的问题,

1 弄清楚当前数据库的字符集和字符排序的设置

2 出现乱码去发现当前的数据的字符集和数据库链接和结果的字符集与应用的设置是否匹配一致。

3  排序规则不能轻易变换,轻易变换后会可能会出现业务逻辑错误的问题。

9c8ec4f2f4a574a1843ef74899f11432.png

b3105b8b5a30da03b8cb71159fd328f3.png

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

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

相关文章

《HelloGitHub》第 91 期

兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、…

NSS [UUCTF 2022 新生赛]websign

NSS [UUCTF 2022 新生赛]websign 开题就给了提示 ban了F12,鼠标右键,CtrlU 可以用view-source: 别人的思路:ctrls下载页面,notepad打开

Java 工具类 列表动态维护

原本需求:一个二级 list 更新功能。 常规实现:先删除原来的全部数据,再重新插入,这样就很耗时了,所以这里写一个工具类出来。 1. 如果有新增的数据:仅对这些数据新增 2. 如果有删除的数据:仅…

【C++】STL容器——探究List与Vector在使用sort函数排序的区别(14)

前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 一、Sort函数介绍1.Sort函数接口2.Sort…

Vue3.0插槽

用法&#xff1a; 父组件App.vue <template><div><!--将html代码插入到子组件中带默认名称的插槽中--><AChild><!--这段html会插入到AChild组件中<slot></slot>插槽中--><!-- 注意&#xff1a;写在父组件中的html代码只能在父组…

[动态规划] (一) LeetCode 1137.第N个泰波那契数

[动态规划] (一) LeetCode 1137.第N个泰波那契数 文章目录 [动态规划] (一) LeetCode 1137.第N个泰波那契数题目解析解题思路状态表示状态转移方程初始化和填表顺序返回值 代码实现总结空间优化代码实现 总结 1137. 第 N 个泰波那契数 题目解析 解题思路 状态表示 (1) 题目要…

【菜菜研科研小BUG记录】【Latex写作方面1】不定期更新

Latex写作方面&#xff1a; 项目相关背景&#xff1a; &#xff08;1&#xff09;VscodeTexlive环境&#xff0c;bib文件出现报错 &#xff08;2&#xff09;bib报错出现引文重复现象&#xff0c;这个要通过二分法查找重复的引文位置&#xff0c;比较麻烦&#xff0c;比较难找…

linux常用基本命令大全的使用(三)

&#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页石马农青衿 &#x1f304;每日一句&#xff1a;努力一点&#xff0c;优秀一点 &#x1f4d1;前言 本文主要是linux常用基本命令面试篇文章&#xff0c;如果有什么…

【vue3】样式穿透、完整新特性、动态css、css-module

一、样式穿透 vue2里面使用 /deep/ vue3里面使用 :deep() :deep(.el-input__inner){background-color: red; }二、完整新特性 :slotted() //parent.vue <template><div><p>这是父级</p><span></span><A><p class"red"…

线扫相机DALSA--常见问题一:软件安装顺序

1.软件安装顺序 先安装&#xff1a;Sapera_LT_SDK&#xff0c;后安装Xtium-CL MX4驱动。 2.初次安装CamExpert&#xff0c;重启电脑后未找到相机 Settings(搜索协议)配置完毕后&#xff0c;需点击Detect Camera(一键查找相机)按钮&#xff0c;搜索相机。第一次查找相机耗时会略…

电脑有自带的录屏功能吗win7

win7有自带的录屏软件&#xff0c;名字叫“问题步骤记录器”&#xff0c;可以实现将每一步操作截成图片&#xff0c;并自动配以相关文字说明的功能。打开记录器的方法&#xff1a;1、按“WinR”键&#xff0c;打开“运行”窗口&#xff1b;2、在“运行”窗口中&#xff0c;输入…

推荐免费的文本转语音工具TTS-Vue【且开源】

标签&#xff1a; 文本转语音&#xff1b; 免费文本转语音软件&#xff1b; 网上有很多文本转语音的工具&#xff0c;但收费具多。 这里推荐一个免费的文本转语音工具。 不需要注册&#xff0c;下载安装就可以使用。且代码开源。 TTS-Vue 软件主页&#xff1a;https://loker…

【uniapp】uview1.x使用upload上传图片

和2.x不同的是&#xff0c;要用 action 来配置后端上传图片的接口地址&#xff1b; 再来一些配置项的命名有所不同&#xff0c;一般1.x的命名用 -&#xff0c;2.x的命名使用小驼峰&#xff1b; 1.x 的上传会自带删除时的提示框&#xff0c;2.x 没有&#xff1b; 重要的几个配置…

python下拉框选择测试

把下拉选择的值得打印出来&#xff1a; import tkinter as tk def on_select(event): # 当选择下拉框中的一项时&#xff0c;此函数将被调用 selected event.widget.cget("text") # 获取选中的文本 print(f"You selected: {selected}") # 打印选中…

Android JNI/NDK 入门从一到二

1. 前言 最基础的创建JNI接口的操作&#xff0c;可以直接看这篇文章 : 第一个Android JNI工程&#xff0c; 本文会基于掌握创建JNI接口的操作的基础之上&#xff0c;来入门JNI/NDK。 2. 在JNI中打印日志 2.1 添加log模块 记得CMake中有log模块&#xff0c;不然编译不过 ta…

Vue 数据绑定 和 数据渲染

目录 一、Vue快速入门 1.简介 : 2.MVVM : 3.准备工作 : 二、数据绑定 1.实例 : 2.验证 : 三、数据渲染 1.单向渲染 : 2.双向渲染 : 一、Vue快速入门 1.简介 : (1) Vue[/vju/]&#xff0c;是Vue.js的简称&#xff0c;是一个前端框架&#xff0c;常用于构建前端用户…

【SEC 学习】美化 Linux 终端

一、步骤 1. 进入 /etc/bash.bashrc vim /etc/bash.bashrc2. 重新加载 bash.bashrc source /etc/bash.bashrc二、各参数指标 符号含义\u当前用户的账号名称\h仅取主机的第一个名字&#xff0c;如上例&#xff0c;则为fc4&#xff0c;.linux则被省略\H完整的主机名称。例如&…

python之计算平面点集的的面积

在当今数据驱动的世界中&#xff0c;计算平面点集的最小外接轮廓面积被广泛应用于各种实际场景中。它是一项重要而魅力十足的任务&#xff0c;旨在找到一个最小的矩形或多边形区域&#xff0c;能够完全包围给定的离散点集。这个看似简单的问题背后隐藏着许多挑战&#xff0c;需…

034-第三代软件开发-自定义Slider(一)

第三代软件开发-自定义Slider(一) 文章目录 第三代软件开发-自定义Slider(一)项目介绍自定义Slider(一)总结一下 关键字&#xff1a; Qt、 Qml、 Slider、 position、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Met…

基本微信小程序的体检预约小程序

项目介绍 我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;体检预约系统小程序被用户普遍使用&#xff0c;为方便用户…