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 執行此操作。