代码之家  ›  专栏  ›  技术社区  ›  Andrew Burns

CHECKSUM()和BINARY_CHECKSUM()之间有什么区别?什么时候/什么是合适的使用场景?

  •  16
  • Andrew Burns  · 技术社区  · 17 年前

    同样,MSDN并没有用通俗易懂的英语解释确切的区别,也没有解释何时选择一个而不是另一个。

    CHECKSUM

    返回在表的一行或表达式列表上计算的校验和值。校验和用于构建散列索引。

    BINARY_CHECKSUM

    返回在表的一行或表达式列表上计算的二进制校验和值。二进制校验和可用于检测表行的更改。

    5 回复  |  直到 17 年前
        1
  •  23
  •   nee21    8 年前

    查看下面的博客文章,其中突出了这些差异。

    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()函数计算类型并比较两个字符串,如果它们相等,则只返回相同的值。

    Example:
    STRING              BINARY_CHECKSUM_USAGE    CHECKSUM_USAGE
    ------------------- ----------------------    -----------
    2Volvo Director 20  -1356512636                -341465450
    3Volvo Director 30  -1356512636                -341453853
    4Volvo Director 40  -1356512636                -341455363
    
        2
  •  8
  •   user250718    15 年前

    有趣的是,校验和与二进制校验和所用的时间完全相同。

    以下是我的帖子,全文已发布: http://networkprogramming.wordpress.com/2011/01/14/binary_checksum-vs-hashbytes-in-sql/

        3
  •  6
  •   Pete    16 年前

    我发现校验和冲突(即两个不同的值返回相同的校验和)比大多数人想象的更常见。我们有一个货币表,使用ISO货币代码作为主键。在少于200行的表中,有三对货币代码返回相同的二进制校验和()

    • “ETB”和“EUR”(埃塞俄比亚比尔和欧元)都返回16386。
    • “LTL”和“MDL”(立陶宛利塔斯和摩尔多瓦列伊)都返回18700。
    • “TJS”和“UZS”(索莫尼和乌兹别克斯坦Som)都返回20723。

    将二进制校验和()更改为校验和()可以解决这些情况下的问题…但在其他情况下可能没有帮助。因此,我的建议是在过度依赖这些函数的唯一性之前进行彻底的测试。

        4
  •  5
  •   Yasir    12 年前

    使用CHECSUM时要小心,可能会得到意想不到的结果。以下语句产生相同的校验和值;

    SELECT CHECKSUM (N'这么便宜怎么办?廉价iPhone售价再曝光', 5, 4102)
    SELECT CHECKSUM (N'PlayStation Now – Sony startet Spiele-Streaming im Sommer 2014', 238, 13096)
    
        5
  •  2
  •   Greg Linwood Greg Linwood    17 年前