SQL 語法將 % 字元視為萬用字元
-
系統在做模糊查詢時,如果要查詢的字串包含有 % 字元,會被 SQL 認為是萬用字元
- 所以針對使用者輸入的變數,檢查是否有 % 字元,將其使用跳脫符號避免結果與預期不同
- Ms sql
-
使用 [] 跳脫
-
將 % 替換成 [%]
-
- Oracle
-
需要在 LIKE 參數後面使用 ESCAPE 關鍵字,定義符號 \ 為跳脫符號
-
將 % 替換成 \%
-
- Ms sql
-
修改 C# 中組合 SQL 語句處,找尋 param 中有含 % 字元的,針對不同 DBType 做SQL語法處理
//... // 如果值包含 '%' 字元,則對 SQL 語法處理 if (param.ContainsKey(name) && param[name].Contains("%")) { var escapedVal = ""; switch (DBType) { case MsSqlServer: // 在 SQL Server 中將 % 替換為 [%] 跳脫 escapedValue = param[name].Replace("%", "[%]"); // 替換 SQL 語法中的參數值 Sql = Sql.Replace(m.Groups["param"].Value, "'" + escapedVal + "'"); break; case Oracle: // 在 Oracle 中將 % 替換為 \% 跳脫 escapedValue = param[name].Replace("%", @"\%"); // 如果是 LIKE '%'||'param' 子句 // 替換 SQL 語法中的值,以及加入 ESCAPE '\' if (string.IsNullOrEmpty(m.Groups["escape"].Value)) { Sql = Sql.Replace(m.Groups["param"].Value, "'" + escapedVal + "' ESCAPE '\\'"); } else { // 如果是 LIKE '%'||'param%'||'%' 子句 // 則替換 SQL 語法中的值,和替換後面的 '%' 子句,加入 ESCAPE '\' Sql = Sql.Replace(m.Groups["param"].Value, "'" + escapedVal + "'"); Sql = Sql.Replace(m.Groups["escape"].Value, "||'%' ESCAPE '\\'"); } break; } }