我有一个MySQL数据库,其中包含一个带有二进制类型列的表。我希望能够投影该列,而不必运行它,例如HEX()
。mysql
CLI工具是否有配置选项或其他方式来显示二进制数据的表示,而不会输出任意字节供我的控制台以滑稽/烦人的方式进行解释?
使用param启动MySQL CLI--二进制为十六进制
示例:
mysql --binary-as-hex
在/etc/my.cnf
中设置mysql客户端选项对我有用:
[client]
binary-as-hex = true
[mysql]
binary-as-hex = true
由于您想查看该表主要是为了方便起见,因此创建一个视图:
CREATE OR REPLACE VIEW myview AS
SELECT col1, HEX(col2) AS col2, col3, etc....
FROM table;
然后,您所要做的就是引用myview
而不是table
:
SELECT * FROM myview;
MySQL命令行客户端在查看带有二进制数据的结果集时的行为一直让我很烦恼,事实上,我之所以找到这个页面,是因为我再次被MySQL命令行客户机(在查看带有二元UUID列的结果集时将二进制数据转储到我的终端)惹恼了,我想一劳永逸地解决这个问题:-)
创建视图对我来说真的不是一个选项(我看到了几十个带有二进制UUID列的表),我还发现从SELECT *
切换到键入所有列名真的很烦人(只是为了HEX()
可以应用于一列的值)。
最终,我想出了一个创造性的破解,它为解决这一烦恼的替代解决方案提供了灵感:使用自定义寻呼机命令为终端渲染净化输出。以下是它的工作原理:
-
创建一个包含以下内容的可执行(chmod+x)Python脚本:
#!/usr/bin/python import binascii, string, sys for line in sys.stdin: line = line.rstrip() column, _, value = line.partition(': ') if any(c not in string.printable for c in value): sys.stdout.write("%s: %sn" % (column, binascii.hexlify(value))) else: sys.stdout.write("%sn" % line)
-
按如下方式启动MySQL命令行客户端:
$ mysql --pager=/home/peter/binary-filter.py --vertical ...
根据需要更改Python脚本的路径名。您也可以将脚本放在
$PATH
中,在这种情况下,您只需将名称传递给--pager
选项(类似于将less
用作MySQL客户端的寻呼机)。 -
现在,当您使用
SELECT ...
时,任何显示其值包含不可打印字符的列的行都会被重写,以便将完整的值呈现为十六进制字符,类似于MySQL的HEX()
函数的结果。
免责声明:这远不是一个完整的解决方案,例如,我展示的Python片段需要SELECT ... G
格式的输出(因此有了--vertical
选项),我对它进行了整整五分钟的测试,所以它肯定会包含错误。
我的观点是表明这个问题可以在MySQL命令行客户端解决,因为这就是问题所在!(这就是为什么我觉得定义服务器端视图是倒退的——只是为了让命令行客户端更友好:-P)
对我来说,数据库大小没有问题,所以我会在每个表中使用两个不同的列,一个是二进制(16),另一个是char(32),不带索引。它们都将具有相同的值。当我需要搜索时,我会使用二进制列,当我需要阅读时,我将使用char(32)。这种情况有什么问题吗?