成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL客戶端顯示binary字符代碼改造

數據庫 MySQL
MySQL客戶端字符顯示依賴charset_for_protocol()函數,可以根據自己的需求修改該函數的顯示方式,方便自己的使用。

一、客戶端顯示字符背景介紹

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-hex
mysql> 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 -uroot
mysql> 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跟蹤一下代碼堆棧:

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 0x0000555558e60ca8 in THD::send_result_metadata (this=0x7fff34000c00, list=..., flags=5)
at /home/greatdb/sql/sql_class.cc:2831
#2 0x0000555558d9fe59 in Query_result_send::send_result_set_metadata (this=0x7fff3429cfa0,
thd=0x7fff34000c00, list=..., flags=5)
at /home/greatdb/sql/query_result.cc:74
#3 0x0000555559093d1b in Query_expression::ExecuteIteratorQuery (this=0x7fff3429ae08,
thd=0x7fff34000c00) at /home/greatdb/sql/sql_union.cc:1169
#4 0x0000555559094452 in Query_expression::execute (this=0x7fff3429ae08, thd=0x7fff34000c00)
at /home/greatdb/sql/sql_union.cc:1305
#5 0x0000555558fd4b18 in Sql_cmd_dml::execute_inner (this=0x7fff3429cf68, thd=0x7fff34000c00)
at /home/greatdb/sql/sql_select.cc:810
#6 0x0000555558fd3f24 in Sql_cmd_dml::execute (this=0x7fff3429cf68, thd=0x7fff34000c00)
at /home/greatdb/sql/sql_select.cc:578
#7 0x0000555558f4ac03 in mysql_execute_command (thd=0x7fff34000c00, first_level=true)
at /home/greatdb/sql/sql_parse.cc:4784
#8 0x0000555558f4cd80 in dispatch_sql_command (thd=0x7fff34000c00, parser_state=0x7fffe82ab990,
update_userstat=false) at /home/greatdb/sql/sql_parse.cc:5384
#9 0x0000555558f42257 in dispatch_command (thd=0x7fff34000c00, com_data=0x7fffe82acb70,
command=COM_QUERY) at /home/greatdb/sql/sql_parse.cc:1992
#10 0x0000555558f405c7 in do_command (thd=0x7fff34000c00)
at /home/greatdb/sql/sql_parse.cc:1440
#11 0x0000555559163f7e in handle_connection (arg=0x55556091c920)
at /home/greatdb/sql/conn_handler/connection_handler_per_thread.cc:307
#12 0x000055555ad85edf in pfs_spawn_thread (arg=0x5555607808c0)
at /home/greatdb/storage/perfschema/pfs.cc:2899
#13 0x00007ffff77a6609 in start_thread (arg=<optimized out>) at pthread_create.c:477
#14 0x00007ffff76cb163 in 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 in set (0.00 sec)

四、總結

MySQL客戶端字符顯示依賴charset_for_protocol()函數,可以根據自己的需求修改該函數的顯示方式,方便自己的使用。如果未來新定義Item或者Field記得也要相應修改該函數來正確顯示數據。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2017-01-11 10:38:17

MySQL客戶端代碼

2014-08-11 16:35:35

KafkaJava客戶端

2010-04-21 12:57:33

RAC負載均衡配置

2010-03-18 16:49:43

Java Socket

2021-09-22 15:46:29

虛擬桌面瘦客戶端胖客戶端

2011-08-17 10:10:59

2010-06-02 10:27:56

MySQL客戶端工具

2020-11-17 08:53:07

MySQL數據庫技術

2011-03-24 13:00:31

配置nagios客戶端

2011-03-02 14:36:24

Filezilla客戶端

2010-12-21 11:03:15

獲取客戶端證書

2010-03-18 17:30:46

Java Socket

2011-10-26 13:17:05

2010-05-31 10:11:32

瘦客戶端

2011-03-21 14:53:36

Nagios監控Linux

2011-04-06 14:24:20

Nagios監控Linux

2013-05-09 09:33:59

2009-03-04 10:27:50

客戶端組件桌面虛擬化Xendesktop

2010-03-18 17:47:07

Java 多客戶端通信

2012-06-08 16:25:36

Exchange
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久草精品在线 | 免费在线观看黄色av | 国产91久久久久久 | 欧美一级www片免费观看 | 国产a级毛片 | 日本一区二区三区视频在线 | 黄色三级在线播放 | 日韩精品一区二区三区中文在线 | 中文字幕精品一区 | 亚洲精品欧美一区二区三区 | 夜夜干夜夜操 | 久久久www成人免费无遮挡大片 | 一起操网站 | 亚洲在线免费 | 成人在线观看黄 | 免费一级做a爰片久久毛片潮喷 | 精品在线一区二区三区 | 精品久久香蕉国产线看观看亚洲 | 亚洲视频不卡 | 久久亚洲精品国产精品紫薇 | 久久久久久久一级 | 日韩综合网 | 欧美午夜精品 | 欧美午夜视频 | 国产91综合 | 欧美精品啪啪 | 久久久久久国产 | 成人免费视频在线观看 | 日韩成人免费视频 | 国产乱码精品一区二区三区中文 | av一区二区三区四区 | 97精品一区二区 | 午夜三级网站 | 久久视频精品 | 国产精品一区二区免费 | 亚洲精品一区二区三区蜜桃久 | 国产我和子的乱视频网站 | 欧美一区二区三区视频 | 人人看人人搞 | 日韩高清一区 | 在线久草|