MySQL客户端显示binary字符代码改造

网友投稿 512 2023-06-06

MySQL客户端显示binary字符代码改造

MySQL客户端显示binary字符代码改造

一、客户端显示字符背景介绍

MySQL最新版本有一个新功能,在使用客户端的时候,最后加上--skip-binary-as-hex选项可以直接显示二进制值对应的字符串,不加该选项就可以按照原来的设置格式显示。先来看一下以下的varbaniry的显示例子。

#建表:create table varb(id int,bb varbinary(1000));insert into varb values(1,'abcd');#登录:mysql -h 127.0.0.1 -P3307 -uroot --skip-binary-as-hexmysql> select * from varb;+------+------+| id | bb |+------+------+| 1 | abcd |+------+------+1 row in set (0.00 sec)

如果不加--skip-binary-as-hex选项的显示如下:

mysql -h 127.0.0.1 -P3307 -urootmysql> select * from varb;+------+------------+| id | bb |+------+------------+| 1 | 0x61626364 |+------+------------+1 row in set (0.01 sec)

这个功能对于用惯了旧版本的同学们有的会觉得不方便,今天这里动手改造一下都显示成字符格式而不用通过--skip-binary-as-hex选项设置。

二、代码跟踪

沿用上面的表查询一下哪段代码决定字符的显示格式,代码解析如下:

输入该命令后找到相关字符显示的代码:

mysql> select * from varb;

class Item_field的成员函数如下:

const CHARSET_INFO *charset_for_protocol(void) override { return field->charset_for_protocol(); #表字段的字符显示取决于field的字符设置。 }

继续找到class Field的成员函数如下:

const CHARSET_INFO *charset_for_protocol() const { return binary() ? &my_charset_bin : charset(); #field的字符设置取决于是否binary类型。 }

输入以上命令GDB跟踪一下代码堆栈:

对于非表字段的内容显示格式取决于什么呢?继续找:

mysql> select 'abcd' from varb;

输入该命令后找到相关字符显示的代码,对于非表字段的内容取决于结果是否STRING_RESULT,'abcd'属于Item_string,result_type()=STRING_RESULT,所以显示字符格式是collation.collation。

class Item的成员函数如下:

virtual const CHARSET_INFO *charset_for_protocol() { return result_type() == STRING_RESULT ? collation.collation : &my_charset_bin; }

三、代码改造

针对上面介绍的第一种情况改造代码如下:

mysql> select * from varb;#class Field的成员函数改成如下,其中system_charset_info=my_charset_utf8_general_ci: const CHARSET_INFO *charset_for_protocol() const { return system_charset_info; }

登录客户端,可以看到结果已经自动显示成字符格式而不是刚才看到的baniry格式。

mysql -h 127.0.0.1 -P3307 -urootmysql> select * from varb;+------+------+| id | bb |+------+------+| 1 | abcd |+------+------+1 row in set (0.00 sec)

四、总结

MySQL客户端字符显示依赖charset_for_protocol()函数,可以根据自己的需求修改该函数的显示方式,方便自己的使用。如果未来新定义Item或者Field记得也要相应修改该函数来正确显示数据。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:什么?你还不会安装MySQL
下一篇:数据库:分享四个实用的SQLServer脚本函数
相关文章