如何通过Sequel PRO显示的varbinary字符串查询IP数据?
正确查询varbinary列的方法
你遇到的问题核心是:Sequel Pro显示的"乱码"是把varbinary的原始二进制数据按当前字符集(utf8mb4)错误解码后的结果,直接复制这个乱码转成BINARY,得到的二进制值和原始varbinary数据完全不一致,所以无法匹配。
以下是两种可靠的解决方法:
方法1:使用十六进制字符串查询(推荐)
这是最准确的方式,因为十六进制可以精确表示二进制数据:
先获取目标IP对应的十六进制值:
如果知道其他匹配条件(比如id),执行以下语句得到ip列的十六进制表示:SELECT HEX(ip) FROM IP_MAP WHERE id = 你的ID值;你会得到类似
C39CC3974C253EC2A8E282AC4EC3B350这样的十六进制字符串。用十六进制值查询匹配行:
将上面得到的十六进制字符串传入UNHEX()函数,即可精准匹配原始varbinary数据:SELECT * FROM IP_MAP WHERE ip = UNHEX('C39CC3974C253EC2A8E282AC4EC3B350');
方法2:基于字符集转换查询(仅当十六进制不可用时尝试)
如果只能通过Sequel Pro显示的乱码来查询,可以尝试将乱码按Sequel Pro使用的字符集(这里是utf8mb4)转换为二进制:
SELECT * FROM IP_MAP WHERE ip = CAST('Ü×L%>¨€NóP' AS BINARY CHARACTER SET utf8mb4);
注意:这种方法不一定百分百成功,因为部分二进制序列在utf8mb4中是无效字符,Sequel Pro可能会对其做替换处理,导致转换后的二进制和原始数据不一致。
补充说明:varbinary列存储的是原始二进制字节,不会做字符集转换。Sequel Pro为了显示内容,会强制用当前连接的字符集去解码这些字节,所以出现"乱码"是正常现象,不要直接使用这些乱码字符串做二进制匹配。
内容的提问来源于stack exchange,提问作者sanjihan
相关产品推荐
相关产品推荐

