从这个问题的答案中,我试图通过将字符串转换为十六进制并比较这些值而不是直接和危险地直接使用来自用户的字符串来使我的程序更安全。我修改了该问题的代码以添加转换:
function mssql_escape($data) {
if(is_numeric($data))
return $data;
$data = iconv("ISO-8859-1", "UTF-16", $data);
$unpacked = unpack('H*hex', $data);
return '0x' . $unpacked['hex'];
}
我这样做是因为在我的数据库中我使用的是 nvarchar 而不是 varchar。现在,当我在 php 端运行它时,它会出现
0xfeff00680065006c006c006f00200077006f0072006c00640021
然后我运行以下查询:
declare @test nvarchar(100);
set @test = 'hello world!';
select CONVERT(VARBINARY(MAX), @test);
结果是:
0x680065006C006C006F00200077006F0072006C0064002100
现在您会注意到这些数字几乎相同。除了尾随零之外,唯一的区别是 feff00。为什么会在那里?我意识到我所要做的就是转变,但我真的很想知道它为什么在那里,而不是仅仅做出假设。谁能向我解释为什么 php 决定在我的十六进制前面抛出 feff00 (黄色!)?