LIKE 查询中的 ESCAPE 语句
如果你将文本搜索实现为 LIKE
-query,你通常会这样做:
SELECT *
FROM T_Whatever
WHERE SomeField LIKE CONCAT('%', @in_SearchText, '%')
但是,(除了你可以在使用全文搜索时不必使用 LIKE
的事实),当有人输入“50%”或“a_b”这样的文本时,这会产生问题。
所以(而不是切换到全文搜索),你可以使用 LIKE
-escape 语句解决该问题:
SELECT *
FROM T_Whatever
WHERE SomeField LIKE CONCAT('%', @in_SearchText, '%') ESCAPE '\'
这意味着\
现在将被视为 ESCAPE 角色。这意味着,你现在可以将\
添加到你搜索的字符串中的每个字符,结果将开始正确,即使用户输入了像%
或 _
这样的特殊字符。
例如
string stringToSearch = "abc_def 50%";
string newString = "";
foreach(char c in stringToSearch)
newString += @"\" + c;
sqlCmd.Parameters.Add("@in_SearchText", newString);
// instead of sqlCmd.Parameters.Add("@in_SearchText", stringToSearch);
注意:上述算法仅用于演示目的。如果 1 个字素由多个字符组成(utf-8),则不起作用。例如 string stringToSearch = "Les Mise\u0301rables";
你需要为每个字素执行此操作,而不是为每个字符执行此操作。如果你正在处理亚洲/东亚/南亚语言,则不应使用上述算法。或者更确切地说,如果你想要开始使用正确的代码,那么你应该为每个 graphemeCluster 执行此操作。