C# 将普通字符串转换为 SQL LIKE 查询格式的方法

栗子
栗子
发布时间:2026-10-14| 6人浏览过
原创

本文介绍如何在 C# 中将用户输入的普通字符串转换为符合 SQL LIKE 查询语法的格式,重点处理单引号、通配符及方括号的转义逻辑。

背景与问题

在使用 C# 构建动态 SQL 查询(如拼接 WHERE 条件)时,如果涉及 LIKE 模糊搜索,直接插入用户输入会导致严重的语法错误或潜在的安全漏洞。SQL 中的通配符 %(匹配任意多个字符)和 _(匹配单个字符)会被数据库引擎解析为搜索模式的一部分,而非字面量。此外,' 需要转义以保护字符串边界,而某些方言(如 Access 或旧版 SQL Server)中 [] 具有特殊含义。

为了避免编写复杂的正则表达式或依赖大型 ORM 框架的内置功能,可以使用一个轻量级的辅助函数来处理这些特定字符。

核心实现:ToLikeSql 函数

以下代码展示了一个静态扩展方法,它接收原始字符串,并按顺序执行必要的转义操作。

/// <summary>
/// 对字符串进行sql格式化,并且符合like查询的格式。
/// </summary>
/// <param name="str">要转换的字符串</param>
/// <returns>格式化后的字符串</returns>
public static string ToLikeSql(string sqlstr)
{
    if (sqlstr == null)
        return "";

    StringBuilder str = new StringBuilder(sqlstr);
    // 1. 转义单引号,防止SQL语法错误
    str.Replace("'","''");
    // 2. 转义左方括号,防止被识别为字符集范围定义
    str.Replace("[","[[]");
    // 3. 转义百分号通配符
    str.Replace("%","[%]");
    // 4. 转义下划线通配符
    str.Replace("_","[_]");

    return str.ToString();
}

关键步骤解析

第1步:空值检查与初始化

目的:避免 NullReferenceException 并准备可变的字符串缓冲区。

动作:首先判断输入是否为 null,若是则返回空字符串。随后实例化 StringBuilder,传入原始字符串。使用 StringBuilder 而非直接多次调用 string.Replace 可以提高性能,特别是当字符串较长或转义次数较多时。

第2步:单引号转义(SQL 通用规则)

目的:确保字符串中的单引号被视为数据内容,而不是字符串结束标记。

操作:str.Replace("'","''")。在标准 SQL 中,两个单引号表示一个字面量的单引号。这一步是防止 SQL 注入和语法崩溃的基础,无论是否使用参数化查询,手动拼接时都不可省略。

第3步:方括号转义(特定方言/防歧义)

目的:防止 [ 被误认为字符集合的开始符。

操作:str.Replace("[","[[]")。在 Microsoft SQL Server 和 Jet (Access) 数据库中,[] 用于界定标识符或定义字符集合。将 [ 转为 [[] 后,后续的 ] 依然保持原样。这通常与第四步配合使用来构造标准的 ESCAPE 序列,或者作为预防性措施防止部分数据库驱动报错。

第4步:通配符转义(LIKE 核心规则)

目的:将 % 和 _ 从“匹配任意字符”转变为“匹配字面量 % 和 _”。

操作:str.Replace("%","[%]") 和 str.Replace("_","[_]")。

重要说明:上述代码使用的是最简化的转义方式——直接包裹方括号。这在 SQL Server 中是有效的,因为 LIKE '[%]' 会精确匹配字面上的百分号字符。然而,这种写法依赖于 SQL Server 特有的行为。在 MySQL 或其他严格遵循 ANSI SQL 的数据库中,通常需要引入 ESCAPE 关键字配合自定义转义字符(如 \%)。如果目标数据库不是 SQL Server,建议改用以下更通用的策略:

  1. 选择一个不会出现在用户输入中的转义字符,例如 \。
  2. 将所有 % 替换为 \%,_ 替换为 \_。
  3. 在最终的 SQL 字符串中添加 ... AND Column LIKE @value ESCAPE '\' ...。

验证与注意事项

  • 输入测试:输入 User's Name % Test,预期输出应为 User''s Name [%] Test(基于上述代码)。
  • 数据库兼容性:此特定实现(方括号包裹法)主要适配 Microsoft SQL Server 和 Access 引擎。对于 PostgreSQL、MySQL 或 Oracle,请优先采用参数化查询(Parameterized Queries),这是彻底解决注入和转义问题的最佳实践。如果必须拼接字符串,请查阅对应数据库的 ESCAPE 语法。
  • 安全性提示:尽管此函数缓解了 LIKE 语句的特殊字符问题,但它不能防御所有类型的 SQL 注入攻击(如 OR 1=1 注入)。在生产环境中,强烈建议使用 SqlCommand.Parameters.AddWithValue() 等参数化机制。

总结

在 C# 开发中,处理包含通配符的单引号字符串拼接是一个常见痛点。上述 ToLikeSql 方法提供了一种快速、低开销的解决方案,特别适用于遗留系统维护或对性能敏感的内部工具。开发者需注意其背后的假设前提(如 SQL Server 方言),并在可能的情况下迁移到参数化查询以获得更高的安全性和可移植性。

以上就是C#适用于like语句的SQL格式化函数的详细内容,更多关于C# SQL字符串处理技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。