gpt4 book ai didi

sql-server - 如何确保 Microsoft SQL Server 中的特定字符编码?

转载 作者:行者123 更新时间:2023-12-02 04:34:16 24 4
gpt4 key购买 nike

我需要的是确保字符串以已知的字符编码进行编码。到目前为止,我对 MS SQL Server 的研究和测试表明记录的编码是“UCS-2”,但实际编码(在有问题的服务器上)是“UCS-2LE”。

这看起来不太可靠。我想要的是 PERL、Node 或大多数任何东西中的 ENCODE 函数,这样无论升级或设置更改如何,我的哈希函数都将在已知输入上工作。

我们可以将散列字符串限制为 HEX,因此在最坏的情况下,我们可以手动将 16 个可能的输入字符映射到正确的字节。有人对此有推荐吗?

这是我正在使用的 PERL:

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";

匹配 MS SQL:

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

但我真正想要的是:

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

因此无论 MS SQL 碰巧将输入字符串编码为什么,HASHBYTES 都将始终对已知字节数组进行操作。

最佳答案

SQL Server 仅对声明为 nvarchar 的列、变量和文字使用 UCS-2。在所有其他情况下,它使用 8 位 ASCII 和当前数据库的编码,除非另有说明(例如,使用 collat​​e 子句)。

因此,您要么必须指定一个 Unicode 文字:

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

或者,您可以使用 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 @t t;

附言当然,由于 Wintel 是一个小端平台,SQL Server 使用与操作系统/硬件相同版本的编码。除非 SQL Server 2017 中出现新的东西,否则没有办法在这个宇宙中以原生方式获得大端表示法。

关于sql-server - 如何确保 Microsoft SQL Server 中的特定字符编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45245485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com