Hive metastore 元数据mysql库中文乱码

  • Post author:
  • Post category:mysql


  • 创建hive表时,指定的表注释存在中文字符集
drop table if exists t_archer;
create table t_archer(
                         id int comment "ID",
                         name string comment "英雄名称",
                         hp_max int comment "最大生命",
                         mp_max int comment "最大法力",
                         attack_max int comment "最高物攻",
                         defense_max int comment "最大物防",
                         attack_range string comment "攻击范围",
                         role_main string comment "主要定位",
                         role_assist string comment "次要定位"
) comment "王者荣耀射手信息"
    row format delimited fields terminated by "\t";

但是在查看表结构信息的时候,出现了中文乱码的情况。

出现乱码这种情况一定是客户端使用的解码与服务器实际的编码不一致。

  • 数据库的编码规则

    在这里插入图片描述

    其中 character_set_client 变量规定了客户端发过来了数据,服务器要按哪种编码去解析,这里指定的使用utf8编码去解析客户端的数据,所以要求客户端在发送数据时必须使用utf8编码。

character_set_database这个参数指定的是数据库存储数据时用什么编码,默认是拉丁编码,如果数据库的表不指定编码,则默认继承库的编码,如果字段不设置编码,则默认继承表的编码。

单个字段编码 继承 所属表的编码 继承 所属库的编码 继承 数据库服务器的默认编码,也就是character_set_database。这个参数。

而hive创建的表默认都是使用的latin编码,这样就导致客户端发过去的数据,虽然服务器可以正确解码,但是在存储的时候又转成了latin去存储,而latin这个编码又没有中文字符,所有就出现了乱码。

在mysql服务器向客户端传输数据的时候,也是用的character_set_results 这个参数去编码的。例如我们要查询某个表的数据,mysql会先去看这个表的数据用的什么编码规则,例如GBK,然后再根据这个编码规则解析成字符串,再把这个字符串用 character_set_results 指定的参数去编码好,发送给客户端。

所以hive表默认使用latin编码时就已经出现了乱码,则再去解析数据传给客户端时自然也是乱码的。

  • 解决乱码

    直接修改字段的编码

在这里插入图片描述

凡是可以通过标准输入(键盘)的字符都能唯一的对应的操作系统上的字符表的某个字符,我们再去对这个字符进行编解码的时候其实就是拿着这个字符唯一的 二进制数据 去找使用的解码规则中对应码值即可。如果是网络传输过来的二进制数据,则可以直接反解此二进制数据,找到编码表中对应的 这个字符的二进制数据,然后显示到屏幕上。



版权声明:本文为qq_43750656原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。