2017-07-21 12 views
3

私が必要とするのは、文字列が既知の文字エンコードでエンコードされるようにすることです。これまでのところ、MS SQL Serverの調査とテストでは、文書化されたエンコーディングが「UCS-2」であることが明らかになりましたが、実際のエンコーディングは問題のサーバーでは「UCS-2LE」です。Microsoft SQL Serverで特定の文字エンコーディングを保証する方法は?

これは信頼性が低いと思われます。私が大好きなのは、PERL、Node、またはその他のものにあるようなENCODEの機能です。アップグレードや設定の変更に関係なく、私のハッシュ関数は既知の入力で動作します。

ハッシュ文字列をHEXに制限することができます。最悪の場合、16個の入力文字を適切なバイトに手動でマップできます。誰もがこれについての勧告を持っていますか? MS SQLと一致する

use Digest::SHA qw/sha256/; 
use Encode qw/encode/; 

$seed = 'DDFF5D36-F14D-495D-BAA6-3688786D6CFA'; 
$string = '123456789'; 

$target = '57392CD6A5192B6185C5999EB23D240BB7CEFD26E377D904F6FEF262ED176F97'; 

$encoded = encode('UCS-2LE', $seed.$string); 
$sha256 = uc(unpack("H*", sha256($encoded))); 

print "$target\n$sha256\n"; 

を::

ここで私が使用しているPerlの

HASHBYTES('SHA_256', 'DDFF5D36-F14D-495D-BAA6-3688786D6CFA123456789') 

しかし、私が本当にしたいことは次のとおりです。

HASHBYTES('SHA_256', ENCODE('UCS2-LE', 'DDFF5D36-F14D-495D-BAA6-3688786D6CFA123456789')) 

何があっているのでMS SQLは、入力文字列を次のようにエンコードします。HASHBYTESは、常に既知のバイト配列で動作します。

答えて

0

SQL Serverは、nvarcharと宣言された列、変数、およびリテラルに対してのみUCS-2を使用します。それ以外の場合は特に指定しない限り(たとえば、collate節を使用)、現在のデータベースのエンコーディングで8ビットASCIIを使用します。

-- Variable 
declare @var nvarchar(128) = N'DDFF5D36-F14D-495D-BAA6-3688786D6CFA123456789'; 

select HASHBYTES('SHA_256', @var); 

-- Table column 
declare @t table(
    Value nvarchar(128) 
); 

insert into @t 
select @var; 

select HASHBYTES('SHA_256', t.Value) 
from @t t; 

P.S.:あなたはnvarcharデータ型の変数やテーブルのカラムを使用することができ、

select HASHBYTES('SHA_256', N'DDFF5D36-F14D-495D-BAA6-3688786D6CFA123456789'); 

をまたは:

だから、あなたは、Unicodeリテラルを指定する必要がありますどちらかもちろん、Wintelはリトルエンディアンプラットフォームなので、SQL ServerはOS /ハードウェアと同じバージョンのエンコーディングを使用します。 SQL Server 2017で何か新しいものが出てこない限り、このユニバースでビッグエンディアン表現をネイティブに得る方法はありません。

関連する問題