|
16
|
| Andrew Burns · 技术社区 · 17 年前 |
|
|
1
23
查看下面的博客文章,其中突出了这些差异。 http://decipherinfosys.wordpress.com/2007/05/18/checksum-functions-in-sql-server-2005/ 从该链接添加信息: 校验和函数的主要目的是基于表达式或列列表构建哈希索引。如果使用它在表级别计算和存储一列,以表示使记录在表中唯一的列上的校验和,那么这有助于确定行是否已更改。然后可以使用此机制,而不是与使记录唯一的所有列合并,以查看记录是否已更新。SQLServerBooksOnline有很多关于此功能的示例。
您需要确保要比较的两个校验和之间的列或表达式顺序相同,否则值会不同,并会导致问题。 我们不建议使用校验和(*),因为以这种方式生成的值将基于运行时表定义的列顺序,该顺序可以在一段时间内轻松更改。因此,显式定义列列表。
您可以使用三个校验和函数: 校验和:如上所述。
BINARY_CHECKSUM:如名称所述,它返回在一行或一列表达式上计算的二进制校验和值。校验和与二进制校验和之间的区别在于为字符串数据类型生成的值。这种差异的一个例子是为DECIPHER和DECIPHER生成的值在二进制_校验和的情况下是不同的,但对于校验和函数是相同的(假设我们安装了不区分大小写的实例)。 另一个区别是表达方式的比较。如果两个表达式的元素具有相同的类型和字节表示形式,则BINARY_CHECKSUM()返回相同的值。因此,2Volvo控制器20和3Volvo控制器30将产生相同的值,但是CHECKSUM()函数计算类型并比较两个字符串,如果它们相等,则只返回相同的值。
|
|
|
2
8
有趣的是,校验和与二进制校验和所用的时间完全相同。 以下是我的帖子,全文已发布: http://networkprogramming.wordpress.com/2011/01/14/binary_checksum-vs-hashbytes-in-sql/ |
|
|
3
6
我发现校验和冲突(即两个不同的值返回相同的校验和)比大多数人想象的更常见。我们有一个货币表,使用ISO货币代码作为主键。在少于200行的表中,有三对货币代码返回相同的二进制校验和()
将二进制校验和()更改为校验和()可以解决这些情况下的问题…但在其他情况下可能没有帮助。因此,我的建议是在过度依赖这些函数的唯一性之前进行彻底的测试。 |
|
|
4
5
使用CHECSUM时要小心,可能会得到意想不到的结果。以下语句产生相同的校验和值;
|
|
|
5
2
|
|
John D · 需要为NULL或NOT NULL的WHERE子句 1 年前 |
|
Marc Guillot · 记录值时忽略冲突 1 年前 |
|
|
Fachry Dzaky · 正确使用ROW_NUMBER 1 年前 |
|
|
TriumphTruth · 从满足特定条件的数据集中选择1行 1 年前 |