Comment assurer un enencoding de caractères spécifique dans Microsoft SQL Server?

Ce dont j'ai besoin, c'est de m'assurer qu'une string est encodée dans un enencoding de caractères connu. Jusqu'à présent, mes searchs et mes tests avec MS SQL Server ont révélé que l'enencoding documenté est 'UCS-2', mais le encoding réel (sur le server en question) est 'UCS-2LE'.

Ce qui ne semble pas très fiable. Ce que j'aimerais, c'est une fonction ENCODE telle que trouvée dans PERL, Node, ou tout autre chose, de sorte que, indépendamment des changements de mises à jour ou de parameters, ma fonction de hachage fonctionnera sur une input connue.

Nous pouvons limiter la string de hachage à HEX, donc au pire, nous pourrions mapper manuellement les 16 caractères d'input possibles aux octets appropriés. Quelqu'un at-il une recommandation à ce sujet?

Voici le PERL que j'utilise:

 use Digest::SHA qw/sha256/; use Encode qw/encode/; $seed = 'DDFF5D36-F14D-495D-BAA6-3688786D6CFA'; $ssortingng = '123456789'; $target = '57392CD6A5192B6185C5999EB23D240BB7CEFD26E377D904F6FEF262ED176F97'; $encoded = encode('UCS-2LE', $seed.$ssortingng); $sha256 = uc(unpack("H*", sha256($encoded))); print "$target\n$sha256\n"; 

Qui correspond à MS SQL:

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

Mais ce que je veux vraiment c'est:

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

Donc, peu importe ce que MS SQL arrive à coder la string d'input, les HASHBYTES fonctionneront toujours sur un tableau d'octets connu.

SQL Server utilise UCS-2 uniquement sur les colonnes, les variables et les littéraux déclarés comme nvarchar . Dans tous les autres cas, il utilise l'ASCII 8 bits avec le encoding de la database courante, sauf indication contraire (à l'aide de la clause collate , par exemple).

Donc, vous devez spécifier un littéral Unicode:

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

Ou, vous pouvez utiliser une variable ou une colonne de table du nvarchar données nvarchar :

 -- 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 @tt; 

PS Bien sûr, puisque Wintel est une plate-forme little-endian, SQL Server utilise la même version de l'enencoding que le operating system / matériel. À less que quelque chose de nouveau n'apparaisse dans SQL Server 2017, il n'y a aucun moyen d'get une représentation big-endian dans cet univers en mode natif.