You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL参数添加方法未转义通配符:API数据库对象搜索异常

解决LIKE查询中用户输入通配符导致的匹配异常问题

这个问题很常见——参数化查询确实能有效防止SQL注入,但它不会自动处理LIKE语法里的通配符(%、_),所以当用户输入这些字符时,会被SQL当作通配符解析,导致不符合预期的匹配结果。下面给你两种靠谱的解决方案:

方案一:在C#端提前转义通配符

在把用户输入的参数传给数据库之前,手动转义LIKE的特殊字符。SQL里可以用方括号[]把通配符包裹起来,让它变成普通字符:

// 写一个工具方法处理通配符转义
private string EscapeSqlLikeWildcards(string input)
{
    if (string.IsNullOrWhiteSpace(input))
        return input;
    
    // 转义%和_这两个LIKE通配符
    return input.Replace("%", "[%]").Replace("_", "[_]");
}

// 调用的时候先处理参数
var userInputName = "test%example"; // 用户输入的内容
var escapedName = EscapeSqlLikeWildcards(userInputName);
dbCommand.Parameters.AddWithValue("@name", escapedName);

这样存储过程里的LIKE '%' + @name + '%'就会把用户输入的%当成普通字符去匹配,而不是通配符。

方案二:在存储过程内部处理转义

如果你更倾向于把逻辑放在数据库层,也可以修改存储过程,在执行查询前先转义参数里的通配符:

ALTER PROCEDURE [GetMyDatabaseObjectByName] 
    @name varchar(255) 
AS 
BEGIN
    -- 先转义@name里的%和_
    SET @name = REPLACE(REPLACE(@name, '%', '[%]'), '_', '[_]')
    
    SELECT mdo.Name, mdo.ID 
    FROM MyDatabaseObject mdo 
    WHERE mdo.Name LIKE '%' + @name + '%' 
END

这种方式不需要修改C#代码,所有转义逻辑都在存储过程里完成,适合多个客户端调用同一个存储过程的场景。

额外说明

为什么参数化查询不自动处理这个?因为参数化的核心是防止SQL注入,而通配符是LIKE语法的合法部分,属于业务逻辑的范畴——SQL无法判断你是想让用户用通配符,还是想把它当作普通字符。所以如果你需要严格匹配用户输入的所有字符(包括%和_),就必须手动转义;如果允许用户使用通配符做模糊搜索,那可以不用转义,但要在界面上告知用户这个规则。

内容的提问来源于stack exchange,提问作者Lostaunaum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:28:08