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

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

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

#建表:
createtable varb(id int,bb varbinary(1000));
insertinto varb values(1,'abcd');
#登录:
mysql -h 127.0.0.1-P3307 -uroot --skip-binary-as-hex
mysql>select*from varb;
+------+------+
| id | bb |
+------+------+
|1| abcd |
+------+------+
1 row inset(0.00 sec)

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

mysql -h 127.0.0.1-P3307 -uroot
mysql>select*from varb;
+------+------------+
| id | bb |
+------+------------+
|1|0x61626364|
+------+------------+
1 row inset(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跟踪一下代码堆栈:

Thread 47"mysqld" hit Breakpoint 3, Item_field::charset_for_protocol (this=0x7fff340bc1f0)
at /home/greatdb/sql/item.h:4373
4373 const CHARSET_INFO *charset_for_protocol(void) override {
(gdb) bt
#0 Item_field::charset_for_protocol (this=0x7fff340bc1f0)
at /home/greatdb/sql/item.h:4373#1 0x0000555558e60ca8in THD::send_result_metadata (this=0x7fff34000c00, list=..., flags=5)
at /home/greatdb/sql/sql_class.cc:2831
#2 0x0000555558d9fe59in Query_result_send::send_result_set_metadata (this=0x7fff3429cfa0,
thd=0x7fff34000c00, list=..., flags=5)
at /home/greatdb/sql/query_result.cc:74
#3 0x0000555559093d1bin Query_expression::ExecuteIteratorQuery (this=0x7fff3429ae08,
thd=0x7fff34000c00) at /home/greatdb/sql/sql_union.cc:1169
#4 0x0000555559094452in Query_expression::execute (this=0x7fff3429ae08, thd=0x7fff34000c00)
at /home/greatdb/sql/sql_union.cc:1305
#5 0x0000555558fd4b18in Sql_cmd_dml::execute_inner (this=0x7fff3429cf68, thd=0x7fff34000c00)
at /home/greatdb/sql/sql_select.cc:810
#6 0x0000555558fd3f24in Sql_cmd_dml::execute (this=0x7fff3429cf68, thd=0x7fff34000c00)
at /home/greatdb/sql/sql_select.cc:578
#7 0x0000555558f4ac03in mysql_execute_command (thd=0x7fff34000c00, first_level=true)
at /home/greatdb/sql/sql_parse.cc:4784
#8 0x0000555558f4cd80in dispatch_sql_command (thd=0x7fff34000c00, parser_state=0x7fffe82ab990,
update_userstat=false) at /home/greatdb/sql/sql_parse.cc:5384
#9 0x0000555558f42257in dispatch_command (thd=0x7fff34000c00, com_data=0x7fffe82acb70,
command=COM_QUERY) at /home/greatdb/sql/sql_parse.cc:1992
#10 0x0000555558f405c7in do_command (thd=0x7fff34000c00)
at /home/greatdb/sql/sql_parse.cc:1440
#11 0x0000555559163f7ein handle_connection (arg=0x55556091c920)
at /home/greatdb/sql/conn_handler/connection_handler_per_thread.cc:307
#12 0x000055555ad85edfin pfs_spawn_thread (arg=0x5555607808c0)
at /home/greatdb/storage/perfschema/pfs.cc:2899
#13 0x00007ffff77a6609in start_thread (arg=<optimized out>) at pthread_create.c:477
#14 0x00007ffff76cb163in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

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

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 -uroot
mysql>select*from varb;
+------+------+
| id | bb |
+------+------+
|1| abcd |
+------+------+
1 row inset(0.00 sec)

四、总结

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

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/228080.html<

(0)
运维的头像运维
上一篇2025-04-18 03:29
下一篇 2025-04-18 03:30

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注