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默认规则里,反斜杠是转义字符,会对后续字节进行转义,破坏了原本的精确匹配逻辑,导致无法匹配到目标记录
解决方案
- 优先使用精确匹配:如果是要精确匹配BINARY字段,直接用
=替代LIKE,这更符合BINARY类型的匹配特性:
SELECT HEX(id), name FROM new_table WHERE id = UNHEX("018e32448ce4605ca86ad3d4812de836");
- 保留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
相关产品推荐
相关产品推荐

