我的一个表中有一个字段包含以下字符串:
!"#¤%&/()=?´`?=)(/&%¤#"!\'\'"'
(Only当然是为了测试目的)。我尝试了无数的查询来正确选择这个字段,当然没有返回任何错误,但我似乎就是不能正确选择。
这是我目前使用的查询:
SELECT * FROM mytable WHERE `column` LIKE '%!"#¤%&/()=?´`?=)(/&%¤#"!\\\'\\\'"\'%'
有谁能告诉我我哪里做得不对吗?是否还有其他字符(除了'
)需要转义?我没在任何地方读到过...(不过,我确实尝试在当前符号之前添加反斜杠)。
5条答案
按热度按时间7ajki6be1#
MySQL手册:
MySQL在字符串中使用C转义语法(例如,
\n
表示换行符)。如果希望LIKE
字符串包含文字\
,则必须将其加倍。(除非启用了NO_BACKSLASH_ESCAPES
SQL模式,在这种情况下不使用转义字符。)例如,要搜索\n
,请将其指定为\\n
。要搜索\
,请将其指定为\\\\
;这是因为反斜杠被解析器剥离一次,并且在进行模式匹配时再次剥离,留下单个反斜杠进行匹配。因此,
LIKE
操作符的转义字符串应该分两步进行。在PHP中,它可以是这样的:
使用MySQLi
使用PDO
或者你可以使用PDO prepared statement代替第二步(字面转义):
pwuypxnk2#
不清楚你想得到什么,出了什么问题。
顺便说一下,如果你想保护你的查询不受SQL注入的影响,你应该使用mysql_真实的_escape_string
http://dev.mysql.com/doc/refman/5.0/en/mysql-real-escape-string.html
假设你是PHP
但是必须记住,LIKE操作符有自己的特殊字符(wildchars)
http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#operator_like
所以如果你想阻止这些字符的 * 魔力 *,就必须用反斜杠转义它们
假设你是在PHP我会做
pftdvrlh3#
在某些情况下,使用LOCATE更简单:https://www.w3schools.com/sql/func_mysql_locate.asp
我不能确定什么是更快的:MySQL LIKE vs LOCATE
ORM也不是问题:
对于99%的项目,LOCATE比LIKE更好。你不会为特殊字符而头痛。为什么你需要LIKE的主要原因是一个全文搜索,如果你使用LIKE的目的,那么这意味着你不需要什么特别的东西。
z6psavjg4#
你在用PHP吗?如果是这样,你可以尝试以下操作:
这能解决你的问题吗
cygmwpex5#
如果您正在与(模式)进行比较的字段不是常量(如您指定的字段:
%!"#¤%&/()=?...
),你可以直接在MySQL中转义它,像这样:(其中
pattern
可以是另一列:column2
、MySQL变量或表达式)这在存储过程/函数中也很有用。