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

How to escape wild cards in SQL Server Like Clause

我将 mssql 和 sqlsrv 库(跨平台站点)与 php 一起使用,我不得不使用一个片段来清理字符串,因为这两个库都没有提供 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% 会将 % 解释为通配符,即使在十六进制编码之后也是如此。事实上,% 必须进行十六进制编码才能使 like 比较起作用。

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

示例查询:

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

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

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

function mssqlLikeEscape($string)
{
  $new_string = preg_replace('/([\[\]%_\^])/', '[]', $string);
  return $new_string;
}

用法示例:

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

结果:

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