mysql如何查看blob数据:依托工具与SQL语句直接解析二进制内容
之前线上排查业务异常日志,硬生生卡死在mysql如何查看blob数据这个问题上,瞎忙活大半天,踩了一堆低级误区,才算摸透了实操的正确方式。
一开始完全摸不着头脑。
业务表里面把小型文件缓存、文本日志都存在了blob字段里,日常开发基本碰不到这个字段,出问题需要核对原始数据时,习惯性敲了普通的查询语句,满心以为能直接看到内容。结果不管是用本地的数据库可视化工具,还是服务器原生命令行,查出来的全是一堆无法识别的乱码字符、怪异的符号串,根本提取不出任何有效信息。当时第一反应是数据传输出了问题,字段数据损坏了,甚至准备发起数据回滚工单,整个人白紧张了好久。
折腾好久才搞明白,blob字段的核心特性就是纯二进制存储,它不依附任何字符集编码,普通的查询方式不会自动解码,所以无论怎么调整数据库的编码格式、客户端的显示设置,最终看到的只会是编码错乱的无效字符,所有这些操作都是无用功。
可视化工具查看是最快的临时解法。日常开发用Navicat、DBeaver这类工具的话,不用写复杂语句,直接双击对应的blob字段单元格,会弹出专属的字段编辑窗口,窗口里自带文本预览、二进制查看、文件导出三个选项,绝大多数文本类、小型文件类的blob数据,选文本预览就能直接读取原始内容,图片、压缩包这类格式还能直接导出到本地打开,操作零门槛。
命令行的方式更适配线上服务器环境。
线上服务器没法用可视化工具,只能靠原生SQL语句操作,当时实测有效的方法就两个,简单且不出错。第一种是用hex()函数,执行select hex(blob字段名) from 数据表 where 条件,能把二进制数据转换成规整的十六进制字符串,至少能完整读取原始数据编码,不会出现乱码丢失的情况。第二种针对文本型blob数据,叠加unhex()函数解码,select unhex(hex(blob字段名)) from 数据表,直接还原出最初的文本内容,当时就是靠这个语句精准查到了异常日志的原始内容,快速定位了业务接口的参数漏洞。
之前还傻乎乎试过convert转换函数,想用convert(blob字段 using utf8)来解码,要么查询结果空白,要么直接报编码转换错误,完全解决不了问题。后来确认,convert函数只适配字符型字段,对无字符集的二进制blob数据完全不生效,属于典型的无效操作。
其实这个问题压根没有多复杂,只是新手很容易被常规字段的查询思维固化,默认所有数据库字段都能直接可视化读取,忽略了blob二进制存储的特殊属性,才会反复踩坑浪费时间。
关掉服务器的命令行窗口时,桌面的运维弹窗刚好跳出问题修复成功的提示,指尖还停在键盘的回车按键上。