如何在 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.
我将 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.