【问题标题】:How to convert 8-char string to a 64-bit bigint and vice versa?如何将 8 字符字符串转换为 64 位 bigint,反之亦然?
【发布时间】:2016-06-08 09:09:24
【问题描述】:

有没有一种简单的方法可以将 8 个字符的字符串 (char(8)) 转换为 64 位的 bigint ? (使用 SQL 语句)。

以及如何从这样的bigint 转换回char(8)?

例如:'ABCDabcd' 应变为 0x4142434461626364('A'=65=0x41、'B'=66=0x42 等)

字符串将始终满足以下条件:

  • 它将始终在 CP1 代码页中编码
  • 始终为 8 个字符长(用空格填充)
  • is 将仅使用介于 32 和 127(0x20 到 0x7F)之间的字符

转换是 100% 准确和确定的,这一点非常重要。编码应始终提供相同的结果。

【问题讨论】:

    标签: sql-server sql-server-2008-r2 sql-server-2014


    【解决方案1】:

    有几种方法可以做到这一点:

    -- CHAR(8) variable
    DECLARE @char8 CHAR(8) = 'ABCDabcd'
    
    -- use BINARY_CHECKSUM, should be safe with a CHAR(8) 
    DECLARE @checkInt64 BIGINT = BINARY_CHECKSUM(@char8)
    
    -- use CAST(... AS BINARY(8)), should be safe with a CHAR(8)
    -- note: cannot cast directly from CHAR to INT/BIGINT
    DECLARE @charBinary BINARY(8) = CAST(@char8 AS BINARY(8))
    DECLARE @binaryInt BIGINT = @charBinary
    
    SELECT @char8, @checkInt64, @charBinary, @binaryInt
    -- output: ABCDabcd, 1450341456, 0x4142434461626364, 4702394921898894180
    
    -- VARBINARY/BIGINT can be casted back to the CHAR as well:
    SELECT CAST(CAST(@binaryInt AS BINARY(8)) as CHAR(8)), CAST(@charBinary AS CHAR(8));
    -- output: ABCDabcd, ABCDabcd
    

    BINARY_CHECKSUM 在这种长度下适合 Int64,但只能是一种方式。

    BINARY 将为您提供所需的确切十六进制,并且应该也适合 bigint,并且应该可以转换回来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      相关资源
      最近更新 更多