MySQL命令行插入数据乱码分析

news2025/1/21 8:53:28

MySQL命令行插入数据乱码分析

1.起因

在开发过程中, 在linux 的上MySQL 的客户端提交插入数据的SQL, 然后数据在页面展示的时候乱码,在网上查找了一些资料,说是MySQL 的客户端连接设置是Latin1导致的;(当然肯定还是有是由其他的原因也会导致一样数据乱码的情况,这里就不说其他的情况,就只说这一一种情况)

后续也是修改了客户端的连接方式为UTF8就可以;

2.修改步骤

1.先看MySQL 的客户端连接的字符集

[root@localhost sh]# mysql --help
and boolean options {FALSE|TRUE}  Value (after reading options)
--------------------------------- ----------------------------------------
.....
default-character-set             latin1


//使用说明
  --default-character-set=name 
                      Set the default character set.

2.在连接的时候添加该参数

[root@localhost sh]# mysql -uxxxx -pxxxxxx   --default-character-set=utf8

3.在执行原来有中文的SQL 无乱码发生

3.思考

在使用网上的这种方法修改后,虽然是成功的让数据不乱码; 但是本身还是很好奇,

为什么会出现这样的情况? 为什么修改了客户端的参数后就可以恢复正常? 已经MySQL 数据在网络传输中的编码字符集到底是什么?数据在磁盘存储是怎么存储的,带着这些疑问,我就展开了后面的思考;

4.MySQL 中的字符集变量

在很久之前的学习中,知道有个命令可以查看MySQL所有相关的字符集,但是不太清除这些字符集对应的含义已经作用是什么?

SHOW VARIABLES LIKE 'character%';
//  --default-character-set=utf8 客户端中执行
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+


//  --default-character-set=latin1 客户端中执行
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

然后这里也收集了一些资料是关于这些变量的含义的([MySQL :: MySQL 5.6 参考手册 :: 5.1.7 服务器系统变量](https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html))

  • character_set_client :从客户端到达的语句的字符集。 此变量的会话值是使用字符设置的客户端连接到 服务器
  • character_set_connection:用于指定不带 字符集介绍器和用于数字到字符串的转换
  • character_set_database:默认数据库使用的字符集
  • character_set_filesystem:文件系统字符集。此变量用于 解释引用文件名的字符串文本(varchar 类型)
  • character_set_results:用于将查询结果返回到 客户
  • character_set_server :服务器默认字符集
  • character_set_system: 服务器用于存储标识符的字符集,该值始终为。utf8
  • character_sets_dir :安装字符集的目录

可以看到修改连接方式后,下面三个发生了修改

  • character_set_client
  • character_set_connection
  • character_set_results

5.不同编码客户端执行相同SQL

创建表

-- utf8 客户端  我们关注存储数据  这里那个客户端执行都一样 
create table charcode(
    id int auto_increment primary key ,
    name varchar(64) comment '姓名'
) charset =utf8 engine =innodb;
IDnamehex(name)写入客户端编码方式执行SQL底层数据 charcode.idb
5语法异常C3A8C2AFC2ADC3A6C2B3E280A2C
3A5C2BCE2809AC3A5C2B8C2B8
latin1insert into charcode(name) values(‘语法异常’);C3A8C2AFC2ADC3A6C2B3E280
A2C3A5C2BCE2809AC3A5C2B8C2B8
6aaaaaaaaa616161616161616161utf8insert into charcode(name) values(‘aaaaaaaaa’);616161616161616161
7语法异常E8AFADE6B395E5BC82E5B8B8utf8insert into charcode(name) values(‘语法异常’);E8AFADE6B395E5BC82E5B8B8

charcode.idb 数据文件 【16进制】

在这里插入图片描述

6.不同编码客户端读取数据

UTF8客户端读取数据(在latin 多插入了几条数据,前面只写了id 5,6,7,就拿这三个举例子好了 )

-- utf8 客户端
mysql> select * from charcode;
+----+----------------------------+
| id | name                       |
+----+----------------------------+
|  1 | 语异常                  |
|  2 | 语法异常               |
|  3 | 语法异常               |
|  4 | 语法异常               |
|  5 | 语法异常               |
|  6 | aaaaaaaaa                  |
|  7 | 语法异常                   |
|  8 | bbbbbbbbb                  |
+----+----------------------------+
8 rows in set (0.00 sec)

---latin1 客户端
mysql> select *  from charcode;
+----+--------------+
| id | name         |
+----+--------------+
|  1 | 语异常    |
|  2 | 语法异常 |
|  3 | 语法异常 |
|  4 | 语法异常 |
|  5 | 语法异常 |
|  6 | aaaaaaaaa    |
|  7 | ????         |
|  8 | bbbbbbbbb    |
+----+--------------+

mysql>
//语法异常  utf 编码 e8afade6b395e5bc82e5b8b8
//语法异常    utf 编码 C3A8C2AFC2ADC3A6C2B3E280A2C3A5C2BCE2809AC3A5C2B8C2B8  ? 就是存储数据的时候数据已经乱码?
				iso-8859-1 :E8AFADE6B32EE5BC2CE5B8B8	
这里可以理解 底层存数据是按照utf 存储的数据 也就是该表就是utf

在这里插入图片描述

1.客户端从控制台标准输入读取一行命令文本,其编码为操作系统编码; 语法异常 utf8 编码 e8 af ad e6 b3 95 e5 bc 82 e5 b8 b8

标准shell 输入
e8 af ad
e6 b3 95
e5 bc 82
e5 b8 b8

2.客户端将命令文本发送给服务器;

3.服务器把收到的文本解码为character_set_client latin1编码,这个编码通常与客户端charset_info一致; (客户端以为和shell 客户端一样导致),此时是latin1,服务端以为 e8afade6b395e5bc82e5b8b8 是ISO-8859 ,然后数据表设置的是UTF8,服务器会把e8afade6b395e5bc82e5b8b8 以ISO-8859 解码(单字节)然后再以UTF8 编码,存储到服务器是就是C3A8C2AFC2ADC3A6C2B3E280A2C3A5C2BCE2809AC3A5C2B8C2B8 就是下面的低4步

语法异常ISO-8859UTF8
èe8C3A8
¯af adC2AF
æE6C3A6
³B3C2B3
2EE280A2
åE5C3A5
¼BCC2BC
2CE2809A
åE5C3A5
¸B8C2B8
¸B8C2B8

4.服务器执行命令转成,产生结果 ;使用内部操作字符集(UTF8 (其中涉及到服务器字符集,数据库字符集,表字符集,字段字符集,优先级越来越高)) ;我们这里是表设置的UTF8 ,字段没有设置,所以最后的操作字符集是UTF8

C3A8C2AFC2ADC3A6C2B3E280A2C3A5C2BCE2809AC3A5C2B8C2B8 存到底层文件中

两个客户单读取数据

latin1

5.将结果转码为character_set_results发送给客户端 (latin1);服务器输出是 E8AFADE6B32EE5BC2CE5B8B8

E8AFADE6B32EE5BC2CE5B8B8

6.客户端(latin1)将结果转码为操作系统编码,输出到控制台标准输出

E8AFADE6B32EE5BC2CE5B8B8 转为系统编码输出 语法异常

utf8

5.将结果转码为character_set_results发送给客户端 (utf8

输出 :C3A8C2AFC2ADC3A6C2B3E280A2C3A5C2BCE2809AC3A5C2B8C2B8

6.客户端(utf8)将结果转码为操作系统编码,输出到控制台标准输出 语法异常 出现乱码;

7.结论

问题的根源出现在 客户端没有根据操作系统的编码集在做一次转换; MySQL 会把操作系统的输出流,输入到服务器,服务器使用 default_charcter_set 来判断输入的编码;

当操作系统cmd 的编码和MySQL的客户端编码不一致的时候 ,乱码会出现; 系统标准输入(utf-8)–> 服务器以为是Latin1 ,然后解码 出错,存数据也会出错

当操作系统cmd 的编码和MySQL的客户端编码一致的时候,这个时候,是不换乱码的;MySQL就可以正确的解析出输出的流的编码,进而可以正确的转换;

为了验证这个:

修改操作系统,标准输入流字符集为GBK , 在修改 连接为 --default-character-set=gbk

插入中文的情况下,在GBK 和UTF8 的客户端下,均是正常中文;

命令行情况下:只要操作系统的标准输入和MySQL 客户端的编码保持一致,就没数据乱码;

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

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

相关文章

【iOS开发-AFNetWorking下的POST和GET】

文章目录写在开头GET 和POSTGET 和POST的区别联系AFNetWorking使用方法DEMOGET请求数据GET方法GET请求到的数据解析POST请求POST的请求测试1POST请求测试二请求的数据拼接POST- DEMO2POST方法2参数理解POST方法2的注意头像对于DATA的转换在Block里进行拼接方法MIME Type的简单认…

QFileInfo(文件信息)和临时文件

QFileInfo提供有关文件在文件系统中的名称和位置(路径),其访问权限以及它是目录还是符号链接等的信息。文件的大小和上次修改/读取时间也可用。QFileInfo还可用于获取有关Qt资源的信息 QFileInfo可以指向具有相对或绝对文件路径的文件。绝对…

FFmpeg实现fmp4+h265 aac切片命令

目录 背景 环境 FFmpeg实现fmp4h265 aac切片命令 使用go创建hls server 使用hls.js demo播放 播放地址:hls.js demo 背景 Chrome在104/105版本后,支持硬解h265,使得hls利用浏览器硬解特性播放h265视频。hls官方要求h265必须使用fmp4格…

Yolov5算法解读

yolov5于2020年由glenn-jocher首次提出,直至今日yolov5仍然在不断进行升级迭代。 Yolov5有YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x四个版本。文件中,这几个模型的结构基本一样,不同的是depth_multiple模型深度和width_multiple模型宽度这两个参…

[网络] TCP协议中的三次握手是什么?利用3次握手的SYN Flood DDOS攻击知道吗?

文章目录前言术语TCP协议三次握手的由来网络协议里的握手阶段Sequence Number是什么?TCP协议三次握手都发送了什么数据?TCP数据包长什么样?SYN Flood DDOS攻击是什么?结语前言 介于TCP协议中三次握手经常会被问到,以及…

NBA体育决策和数据挖掘分析

业务挑战 体育运用大数据主要体现在以下三个方面: 预测比赛结果和奖牌归属;更好地训练运动员 。数据和模型驱动体育决策让获胜和成功变得更有可能,体育统计(Sports Analytics)成为体育竞争的“杀手锏”。最近我们被客户要求撰写关于体育统计…

鲲鹏devkit性能分析工具介绍(一)

鲲鹏devkit性能分析工具介绍(一) 鲲鹏性能分析工具由四个子工具组成,分别为:系统性能分析、Java性能分析、系统诊断和调优助手。 系统性能分析是针对基于鲲鹏的服务器的性能分析工具,能收集服务器的处理器硬件、操作…

从2022安洵杯[babyPHP]看Soap+CLRF造成SSRF漏洞

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、PHP SOAP 二、漏洞成因 三、 题目知识准备 1、PHP Session反序列化 2、题目相关函数 四、[LCTF 2018]bestphps revenge 五、2022安洵杯 BabyPHP 前言 …

基于ASP.net的服装商城设计

目录 海秀衣城系统 2 1.概 述 2 1.1 网上购物的发展 2 1.2 三层架构技术简介 2 2. 系统总体设计 4 2.1 开发以及运行环境 4 2.2项目结构分析 4 2.3系统功能总体结构图 5 2.4系统功能结构分解图 5 3. 数据库设计 6 3.1 数据库设计 6 3.2 数据表 7 4. 模块设计 10 4.1 前端功能模…

SpringCloud微服务实践之七 网关(Gateway)

一、网关基本概念 (一)网关功能 身份认证和权限校验服务路由、负载均衡请求限流 (二)网关技术选型 SpringCloud提供了两个组件都可以实现网关功能: gatewayzuul 其中,Zuul是基于Servlet的实现&#xff…

SQL注入漏洞 | 数字型

文章目录前言MySQL 数字型前言 SQL注入漏洞 | iwebsec MySQL 数字型 页面观察:测试看回显 注入点判断:发现有sql注入漏洞 AND 可在 where 子语句中把两个或多个条件结合起来。如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录…

HBuilder X实现tabBar底部导航记录

首先,打开uniapp官网,找到tarbar官方文档,仔细阅读,具体位置如下,全局配置下面的pages.json页面路由里面找到tabBar,点击查看: 重点注意这两句话: 找到文档我们就可以按照上面的提示…

迭代器模式(Iterator)

参考: 迭代器设计模式 (refactoringguru.cn) [design-patterns-cpp/Iterator.cpp at master JakubVojvoda/design-patterns-cpp GitHub 文章目录一、什么是迭代器模式?二、实现三、优缺点优点缺点一、什么是迭代器模式? 提供一种方法&…

QFont-使用外部字体文件的问题

我们程序里面定义了某个结构体(这里简单描述为AStruct),AStruct包含了一个QFont 类型的成员变量: struct AStruct {QFont ft; }; 在具体业务上,AStruct中的QFont会被传递给QPainter去绘制文本。 保存工程/加载工程时时&#xff0…

用Python写个爬虫,赚了!

前言 编程语言排行榜(Tiobe)发布了11月新榜,Python仍领先Java和C,在全球众多的老牌编程语言中,以其他对手无法企及的极高份额稳居榜单第一位。 榜单数据是客观真实的,当下Python的使用者越来越多,已经远超使用其他十…

【Linux初阶】认识冯诺依曼结构

🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:计算机的冯诺依曼组成结构、冯诺依曼结构的数据交换特性,以宏观视角理解冯诺依曼下的网络数据传输…

Spring Cloud Alibaba 容器化部署最佳实践 | 本地部署版本详解

环境声明 在运行本地示例之前,需要保证本机具备以下的基础环境,如果您的本地没有当前的环境,下面会一步步进行搭建,演示搭建过程。 Nacos 服务端Seata 服务端RocketMQ 服务端MySQL 服务端 可在国内https://gitee.com/mirrors/S…

低代码在离散制造业的实践

大家上午好,非常感谢明道云给我这个机会,来展示一下这个上海电气在明道云上面的应用。我的题目是《低代码在离散制造业的实践》。 引入明道云的背景 首先介绍一下我们电气数字科技有限公司。它是在2018年的时候,上海电气集团内部成立的数科…

捷码全新快速表单功能解读

在最近的更新中,捷码迎来了比较多的功能上新,其中最受大家关注的是全新的表单功能。无论是从功能丰富度还是操作便利性上都做了大量设计。本文将从重点功能设置操作流程上进行演示说明。 表单控件和关联 ——1对1、1对n、n对n 支持多场景 首先是表单控…

航空货运数据挖掘那些事|航班换季

目录前言航班换季航班换季对航空货运业务有哪些影响参考文献前言 就在上个月月底,即2022年10月29日到2022年10月30日,中国民航完成了2022年的夏秋季航季到2022/23年冬春航季切换工作,俗称航班换季,那么何为航班换季呢&#xff0c…