You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中BINARY(16)字段使用LIKE查询特定ULID无结果问题排查

BINARY(16)(ULID)字段LIKE查询失效原因解析

在使用LIKE查询BINARY(16)类型(存储ULID)的字段时,遇到特定ULID无法匹配的问题:

  • 目标ULID:01HRS49374C1EAGTPKTJ0JVT1P,对应十六进制值018e32448ce4605ca86ad3d4812de836
  • 其他ULID可通过LIKE正常查询,排除字段长度问题
  • 执行下方SQL时,最后一条SELECT语句返回空结果
CREATE TABLE IF NOT EXISTS new_table (
    id BINARY(16) PRIMARY KEY NOT NULL,
    name VARCHAR(255)
);

INSERT INTO new_table SET id = UNHEX("018e321f579997e1f2a907a72b98f965"), name = "this works fine";
INSERT INTO new_table SET id = UNHEX("018e32448ce4605ca86ad3d4812de836"), name = "try find this using LIKE";

SELECT HEX(id), name FROM new_table WHERE id LIKE UNHEX("018e321f579997e1f2a907a72b98f965");
SELECT HEX(id), name FROM new_table WHERE id LIKE UNHEX("018e32448ce4605ca86ad3d4812de836");

问题原因

核心问题在于MySQL的LIKE操作符对转义字符的处理逻辑:

  • 当用LIKE匹配BINARY类型字段时,MySQL会将二进制数据当作字符串处理
  • 目标ULID对应的十六进制值中,包含字节0x5c(对应ASCII的反斜杠\)
  • 在MySQL默认规则里,反斜杠是转义字符,会对后续字节进行转义,破坏了原本的精确匹配逻辑,导致无法匹配到目标记录

解决方案

  1. 优先使用精确匹配:如果是要精确匹配BINARY字段,直接用=替代LIKE,这更符合BINARY类型的匹配特性:
SELECT HEX(id), name FROM new_table WHERE id = UNHEX("018e32448ce4605ca86ad3d4812de836");
  1. 保留LIKE的处理方式:若必须使用LIKE,可通过两种方式规避转义问题:
-- 临时禁用反斜杠转义
SET sql_mode = 'NO_BACKSLASH_ESCAPES';
SELECT HEX(id), name FROM new_table WHERE id LIKE UNHEX("018e32448ce4605ca86ad3d4812de836");

-- 指定一个不存在于数据中的字符作为转义符(例如空字符)
SELECT HEX(id), name FROM new_table WHERE id LIKE UNHEX("018e32448ce4605ca86ad3d4812de836") ESCAPE '';

内容的提问来源于stack exchange,提问作者Kroksys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:10:33