如果我们改变了Escape字符,它就可以工作:
mysql> SELECT HEX(id), name FROM new_table WHERE id LIKE UNHEX("018e32448ce4605ca86ad3d4812de836") ESCAPE '@';
+----------------------------------+--------------------------+
| HEX(id) | name |
+----------------------------------+--------------------------+
| 018E32448CE4605CA86AD3D4812DE836 | try find this using LIKE |
+----------------------------------+--------------------------+
如果我们禁用反斜杠作为元字符,它也可以工作:
mysql> set sql_mode='NO_BACKSLASH_ESCAPES';
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT HEX(id), name FROM new_table WHERE id LIKE UNHEX("018e32448ce4605ca86ad3d4812de836");
+----------------------------------+--------------------------+
| HEX(id) | name |
+----------------------------------+--------------------------+
| 018E32448CE4605CA86AD3D4812DE836 | try find this using LIKE |
+----------------------------------+--------------------------+
因此,我try 查看客户端中的二进制字符串:
% mysql --skip-binary-as-hex test
mysql> select UNHEX("018e32448ce4605ca86ad3d4812de836");
+-------------------------------------------+
| UNHEX("018e32448ce4605ca86ad3d4812de836") |
+-------------------------------------------+
| ?2D??`\?j?ԁ-?6 |
+-------------------------------------------+
^
这是反斜杠.
关键是LIKE
对字符串中的某些字符应用了一些特殊的含义,如反斜杠和_
和%
.
如果你取消一个随机的十六进制字符串,你不知道字节是否会碰巧成为那些特殊的字符之一,LIKE
.
结论:这不是bug.
LIKE
不是适合您搜索的比较运算符.
在您的示例中,使用=
会很好,因为您判断的是字符串是否相等,而不是使用LIKE
的模式匹配.
这是有效的:
mysql> SELECT HEX(id), name FROM new_table WHERE id = UNHEX("018e32448ce4605ca86ad3d4812de836");
+----------------------------------+--------------------------+
| HEX(id) | name |
+----------------------------------+--------------------------+
| 018E32448CE4605CA86AD3D4812DE836 | try find this using LIKE |
+----------------------------------+--------------------------+