IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL-解析客户端SQL执行字符集参数设置 -> 正文阅读

[大数据]MySQL-解析客户端SQL执行字符集参数设置

前言:

在使用SQL进行查询时,有时会遇到客户端查询返回乱码或者查询结果异常的问题,造成这些问题的主要原因为字符集的参数character_set_client,character_set_connection,character_set_results,collation_connection设置不合理导致,只有保证客户端环境字符集与数据库参数设置字符集一致,才能避免问题的发生。

接下来文章的主要内容是关于解析SQL查询过程中涉及到的相关字符集参数的作用以及如何正确设置字符集参数。

MySQL字符集转化流程

从客户端发起SQL查询到查询结果返回这个过程中需要经过多个流程的编码以及解码,当其中一个流程的字符集设置不正确,就可能导致查询结果返回乱码或者查询结果异常的情况。

字符集转化流程如下:

解析字符集转化流程

????????默认环境字符集设置:

????????客户端编码:UTF8

????????character_set_client:UTF8MB4

????????character_set_connection:UTF8MB4

????????表编码:UTF8MB4

????????character_set_results:UTF8MB4

????????collation_connection:utf8mb4_0900_ai_ci

1 解析客户端环境的字符集作用,客户端会客户端环境的字符集将发送字符编码为字节值发送给MySQL

使用默认字符集从客户端发起一个SQL查询。

select id from test.test where name='牛';

通过tcpdump对3306端口进行抓包,注意不要对连接进行加密,不然会无法抓取到包信息。

tcpdump -S -nn -tttt -i lo host 1XX.1XX.1XX.XX and port 3306 and tcp -c 100 -w /tmp/tcpdump.cap

?对抓包内容进行分析,可以确认对于中文"牛"编码为e7899b字节值。

那么这个e7899b字节值是使用什么字符集编码的呢?

我们可以通过MySQL hex函数进行编码确认e7899b字节值就是通过utf8的编码,与当前客户端环境的字符集一致。

test@3306 22:24:  [test]> SELECT hex(CONVERT('牛' USING utf8 ));
+---------------------------------+
| hex(CONVERT('牛' USING utf8 ))  |
+---------------------------------+
| E7899B                          |
+---------------------------------+
1 row in set, 1 warning (0.00 sec)
?
test@3306 22:24:  [test]>

2?接下来解析character_set_client参数,MySQL根据character_set_client设置的字符集将客户端发送的字节值转化为字符

将character_set_client参数设置为gbk。

set character_set_client=gbk;

再次执行SQL查询select id from test.test where name='牛';查询不到结果,说明这里字符发生了转化。

使用当前字符集配置插入数据(2,'牛')。

insert into test values(2,'牛');

再将character_set_client调整为utf8mb4,执行查询。

select id from test.test where name='牛';

可以看到通过gbk插入的'牛',在utf8里面显示为'鐗'。

而'鐗'是UTF8的字节值'E7 89 9B'通过character_set_client字符集GBK解码的结果,这说明MySQL是按character_set_client的字符集对客户端的字节值进行解码。

3?接下来解析character_set_connection以及collation_connection参数

MySQL根据character_set_connection设置的字符集将上一步的字符转化为当前字符集编码,这个参数不同的字符集设置其实不影响结果的查询返回,因为下一步还是会转化为表字段的字符集再进行比较,这一步主要的作用还是collation_connection参数对字符串的比较规则

接下来我们测试character_set_connection的设置对查询的影响

使用默认字符集从客户端发起一个SQL查询。

select id from test.test where name='牛';

结果返回一条数据。

将character_set_connection设置为gbk。

set character_set_connection=gbk;

从客户端再次执行相同的SQL查询?。

select id from test.test where name='牛';

结果还是返回一条数据,说明character_set_connection参数的字符集设置不影响查询。

分析collation_connection参数的作用

使用默认字符集查询以下SQL。

select 'a'='A'

修改collation_connection为gbk_bin。

set character_set_connection=gbk;
set collation_connection=gbk_bin;

再次查询以下SQL。

select 'a'='A'

需要注意的是,如果需要到表里面查询数据,表列的比较规则还是优先级最高的,不会使用collation_connection

执行以下SQL查询。

select * from test where name='A';

还是返回结果a,因为表的比较规则utf8mb4_0900_ai_ci是不区分大小写的。

4?接下来解析character_set_results参数

MySQL根据参数character_set_results设置的字符集将返回结果编码发送给客户端

使用默认字符集从客户端发起一个SQL查询。

select name from test.test where name='牛';

查询结果返回'牛'。

使用tcpdump进行抓包分析,可以发现'牛'返回的字节值为e7899b为utf8的编码。

将character_set_results设置为gbk。

set character_set_results=gbk;

使用tcpdump进行抓包分析,可以发现'牛'返回的字节值变为ca53为gbk的编码,这说明character_set_results影响着查询结果的返回。

总结

1 四个参数character_set_client,character_set_connection,character_set_results,collation_connection只有character_set_client,character_set_results,collation_connection对查询可能造成影响。

2 避免客户端查询返回乱码或者查询结果异常的方法就是保证客户端环境字符集与数据库参数character_set_client,character_set_connection,character_set_results,collation_connection字符集设置一致。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:12:48  更:2022-08-19 19:16:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:06:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码