如何将8-char字符串转换为64位bigint,反之亦然?

时间:2016-02-25 14:21:38

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

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

如何从bigint转换回char(8)

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

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

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

转换100%准确且确定性非常重要。编码应始终提供相同的结果。

1 个答案:

答案 0 :(得分:2)

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

-- 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,并且应该可以转换回来。

相关问题