如何在 SQL Server Like 子句中转义通配符

Posted

技术标签:

【中文标题】如何在 SQL Server Like 子句中转义通配符【英文标题】:How to escape wild cards in SQL Server Like Clause 【发布时间】:2015-05-19 04:13:16 【问题描述】:

我在 php 中使用 mssql 和 sqlsrv 库(跨平台站点),我不得不使用 sn-p 进行字符串清理,因为这两个库都没有提供 mysqli_real_escape_string 等效项。

我的功能是这样的:

public function sanitize($string)

  if (is_numeric($string) || $string === 'NULL'        
  
      return $string;
  

  $unpacked = unpack('H*hex', $string);
  return '0x' . $unpacked['hex'];

该函数将字符串转换为十六进制值,使字符串中的 sql 语句被解释为字符串。我从堆栈溢出的某个地方得到它。

但是对于LIKE 查询这样的字符串hello% 将把% 解释为通配符,即使在十六进制编码之后也是如此。事实上,% 必须经过十六进制编码才能进行类似的比较。

如何确保任何用户输入的通配符都不会被解释为通配符?

查询示例:

SELECT LastName, FirstName FROM Users WHERE UserCode LIKE 'search string'

其中“搜索字符串”是通过上述 sanitize 函数传递的字符串。 我总是在查询之前将% 添加到字符串的末尾,但用户可能会在开头或中间放置一个,或者使用另一种类型的通配符来阻止查询成功。

【问题讨论】:

【参考方案1】:

我终于为此编写了自己的函数,这就是我决定的。仍然会感谢任何反馈或更好的解决方案。我是否缺少此列表中的任何标记或特殊字符?

function mssqlLikeEscape($string)

  $new_string = preg_replace('/([\[\]%_\^])/', '[$1]', $string);
  return $new_string;

示例用法:

echo mssqlLikeEscape('A [ in the hand is worth % in the bush.');

结果:

A [[] in the hand is worth [%] in the bush.

【讨论】:

请注意,您需要在方括号周围更聪明一点;如果你有一个% 符号,首先它会被编码为[%],然后会变成[[]%],最后会变成[[[]]%[]]。几乎肯定不是你想要的! @EdB 好点。我完全错过了。我必须为 [ & ] 转义编写一个正则表达式,以便它们在同一操作中执行并使其成为第一个检查。

以上是关于如何在 SQL Server Like 子句中转义通配符的主要内容,如果未能解决你的问题,请参考以下文章

在rails中转义SQL LIKE的查询

如何在 String.Format 中转义 %?

如何在 LIKE 子句中转义方括号?

Sql Server LIKE 查询中需要转义哪些字符[重复]

在 SQL Server 中转义单引号

使用 CONTAINSTABLE 在 SQL Server 全文搜索查询中转义 & 号