3.3.2 【MySQL】客户端和服务器通信中的字符集

3.3.2.1 编码和解码使用的字符集不一致的后果

我们知道字符 '我' 在 utf8 字符集编码下的字节串长这样: 0xE68891 ,如果一个程序把这个字节串发送到另一个程序里,另一个程序用不同的字符集去解码这个字节串,假设使用的是 gbk 字符集来解释这串字节,解码过程就是这样的:

1. 首先看第一个字节 0xE6 ,它的值大于 0x7F (十进制:127),说明是两字节编码,继续读一字节后是0xE688 ,然后从 gbk 编码表中查找字节为 0xE688 对应的字符,发现是字符 '鎴'

2. 继续读一个字节 0x91 ,它的值也大于 0x7F ,再往后读一个字节发现木有了,所以这是半个字符。

3. 所以 0xE68891 被 gbk 字符集解释成一个字符 '鎴' 和半个字符。

3.3.2.2 字符集转换的概念

如果接收 0xE68891 这个字节串的程序按照 utf8 字符集进行解码,然后又把它按照 gbk 字符集进行编码,最后编码后的字节串就是 0xCED2 ,我们把这个过程称为 字符集的转换 ,也就是字符串 '我' 从 utf8 字符集转换为gbk 字符集。

3.3.2.3 MySQL中字符集的转换

系统变量

描述

character_set_client

服务器解码请求时使用的字符集

character_set_connection

服务器处理请求时会把请求字符串从 character_set_client 转为 character_set_connection

character_set_results

服务器向客户端返回数据时使用的字符集

这几个系统变量在我的计算机上的默认值如下(不同操作系统的默认值可能不同):

                     

大家可以看到这几个系统变量的值都是 utf8 ,为了体现出字符集在请求处理过程中的变化,我们这里特意修改一个系统变量的值:

mysql> set character_set_connection = gbk;

从这个分析中我们可以得出这么几点需要注意的地方:

服务器认为客户端发送过来的请求是用 character_set_client 编码的。

假设你的客户端采用的字符集和 character_set_client 不一样的话,这就会出现意想不到的情况。比如我的客户端使用的是 utf8 字符集,如果把系统变量 character_set_client 的值设置为 ascii 的话,服务器可能无法理解我们发送的请求,更别谈处理这个请求了。

服务器将把得到的结果集使用 character_set_results 编码后发送给客户端。

假设你的客户端采用的字符集和 character_set_results 不一样的话,这就可能会出现客户端无法解码结果集的情况,结果就是在你的屏幕上出现乱码。比如我的客户端使用的是 utf8 字符集,如果把系统变量character_set_results 的值设置为 ascii 的话,可能会产生乱码。

character_set_connection 只是服务器在将请求的字节串从 character_set_client 转换为character_set_connection 时使用,它是什么其实没多重要,但是一定要注意,该字符集包含的字符范围一定涵盖请求中的字符,要不然会导致有的字符无法使用 character_set_connection 代表的字符集进行编码。比如你把 character_set_client 设置为 utf8 ,把 character_set_connection 设置成 ascii ,那么此时你如果从客户端发送一个汉字到服务器,那么服务器无法使用 ascii 字符集来编码这个汉字,就会向用户发出一个警告。

我们通常都把 character_set_client 、character_set_connection、character_set_results 这三个系统变量设置成和客户端使用的字符集一致的情况,这样减少了很多无谓的字符集转换。为了方便我们设置, MySQL 提供了一条非常简便的语句:

SET NAMES 字符集名;

这一条语句产生的效果和我们执行这3条的效果是一样的:

SET character_set_client = 字符集名;
SET character_set_connection = 字符集名;
SET character_set_results = 字符集名;

比方说我的客户端使用的是 utf8 字符集,所以需要把这几个系统变量的值都设置为 utf8 :

mysql> SET NAMES utf8;

比方说我的客户端使用的是 utf8 字符集,所以需要把这几个系统变量的值都设置为 utf8 :

                       

另外,如果你想在启动客户端的时候就把 character_set_client 、 character_set_connection 、character_set_results 这三个系统变量的值设置成一样的,那我们可以在启动客户端的时候指定一个叫default-character-set 的启动选项,比如在配置文件里可以这么写:

[client]default-character-set=utf8

它起到的效果和执行一遍 SET NAMES utf8 是一样的,都会将那三个系统变量的值设置成 utf8 。

3.3.3 比较规则的应用

比较规则 的作用通常体现比较字符串大小的表达式以及对某个字符串列进行排序中,所以有时候也称为 排序规则 。比方说表 t 的列 col 使用的字符集是 gbk ,使用的比较规则是 gbk_chinese_ci ,我们向里边插入几条记录:

                

我们查询的时候按照 t 列排序一下:

                                        

可以看到在默认的比较规则 gbk_chinese_ci 中是不区分大小写的,我们现在把列 col 的比较规则修改为gbk_bin :

由于 gbk_bin 是直接比较字符的编码,所以是区分大小写的,我们再看一下排序后的查询结果:

                                           

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 当Hadoop集群服务器硬盘挂载不一致时,可能会导致一些问题和挑战。首先,硬盘挂载不一致意味着不同服务器上存储数据的路径不同,这可能会导致数据的分布不均衡,影响集群的性能和可扩展性。 在Hadoop,数据存储在分布式文件系统(HDFS),通过使用块(block)进行分割和存储。每个块通常默认为128MB大小,而HDFS会将一个文件的块分布在不同的服务器上。如果硬盘挂载不一致,导致某些服务器的存储空间受限,将会导致这些服务器上的块数量较少,而其他服务器上的块数量较多。这意味着某些服务器的负载可能会更重,而其他服务器则可能闲置。 此外,如果硬盘挂载不一致,还可能会导致数据冗余问题。例如,如果某个服务器上的硬盘挂载失败或容量不足,数据将无法正确存储。这将导致数据的丢失或损坏,影响整个集群的可靠性。 为解决这个问题,可以采取以下措施: 1. 标准化硬盘挂载:确保每个服务器上的硬盘挂载点一致,这样可以通过相同的路径来访问数据,避免数据分布不均衡的问题。 2. 数据均衡:使用HDFS的数据均衡工具来重新平衡存储在各个服务器上的块的数量,确保每个服务器上存储的数据量相近,从而提高整个集群的性能和可扩展性。 3. 数据备份:使用HDFS的数据备份功能,确保每个数据块都有多个副本存储在不同的服务器上。这样,即使某个服务器上的硬盘挂载失败,数据仍然可以从其他服务器上的副本恢复。 通过采用上述措施,可以减少硬盘挂载不一致所带来的问题和风险,提高Hadoop集群的稳定性和可靠性。 ### 回答2: Hadoop 是一个开源的分布式计算平台,是用于处理和存储大规模数据的解决方案。在 Hadoop 集群,各个服务器的硬盘挂载情况可能会不一致。 硬盘挂载不一致可能会导致 Hadoop 集群的数据分布和性能出现问题。在 Hadoop ,每个服务器都有自己的本地磁盘空间,该空间可以用来存储 Hadoop 的数据块。数据块被分布在不同的服务器上以提高数据的冗余性和可靠性。因此,所有服务器都应该具有相同的硬盘挂载配置,以确保数据块的正确分布。 如果 Hadoop 集群服务器硬盘挂载不一致,可能会导致以下问题: 1. 数据块的分布不均匀:由于服务器的硬盘挂载不同,可能会导致数据块在某些服务器上过于集,而在其他服务器上分布过于分散。这会增加数据读取和写入的延迟,降低整个集群的性能。 2. 数据冗余性下降:Hadoop 通过在不同服务器上复制数据块来提高数据的冗余性。如果服务器的硬盘挂载不一致,可能会导致某些数据块没有被正确地复制到其他服务器上,从而降低数据的可靠性。 为了解决这个问题,可以进行以下操作: 1. 标准化硬盘挂载配置:检查所有服务器上的硬盘挂载配置,确保它们都一致。可以使用一致的标准来进行硬盘分区和挂载。 2. 移动数据块:如果已经存在硬盘挂载不一致的情况下,可以通过将数据块从一个服务器移动到另一个服务器来重新平衡数据的分布。这样可以确保数据块在整个集群分布均匀。 3. 添加额外的存储:如果某些服务器的硬盘空间不足,可以添加额外的存储设备,并将其挂载到集群服务器上。这样可以增加服务器的存储容量,提高整个集群的性能和可靠性。 综上所述,Hadoop 3.3.2 在各个服务器硬盘挂载不一致的情况下可能会导致数据分布和性能方面的问题。要解决这个问题,可以标准化硬盘挂载配置,移动数据块来重新平衡数据分布,并添加额外的存储设备来增加存储容量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

柯西极限存在准则

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值