この質問への回答から、文字列を16進数に変換し、ユーザーから直接文字列を直接危険に使用するのではなく、それらの値を比較することで、プログラムをより安全にしようとしました。その質問のコードを変更して、変換を追加しました。
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'];
}
これを行うのは、データベースでvarcharの代わりにnvarcharを使用しているためです。これで、php側で実行すると、次のようになります。
0xfeff00680065006c006c006f00200077006f0072006c00640021
次に、次のクエリを実行します。
declare @test nvarchar(100);
set @test = 'hello world!';
select CONVERT(VARBINARY(MAX), @test);
結果は次のようになります。
0x680065006C006C006F00200077006F0072006C0064002100
これで、これらの数値がほぼ同じであることがわかります。末尾のゼロを除いて、唯一の違いはfeff00です。なんでそこにあるの?私がしなければならないのはシフトだけだと思いますが、単に仮定するのではなく、なぜそこにあるのかを知りたいのです。phpが私のヘクスの前にfeff00(黄色!)を投げることを決めた理由を誰かが私に説明できますか?