SQL: 将整数转换为十六进制字符串?

6

如何将整数转换为十六进制字符串?我希望将该整数转换为类似于#ff0000的颜色格式,以便在网页上使用。

例如:

--This converts my int to hex:
CONVERT(VARBINARY(8), Color) Color,

我想做这样的事情:
'#' + CONVERT(NVARCHAR(10), CONVERT(VARBINARY(8), Color)) Color

但是将varbinary字符串转换只会将其转换为ASCII字符,而不是返回实际的十六进制字符串。


这似乎是将int转换为十六进制格式,如#0xFF4B0082。我需要一个可以在开头添加'#'的字符串格式,比如'#4B0082'。 - user1636130
2个回答

11

有一个内置的函数可以从二进制值生成十六进制字符串

SELECT
    '#' + sys.fn_varbintohexstr(CONVERT(BINARY(3), 0)),
    '#' + sys.fn_varbintohexstr(CONVERT(BINARY(3), 255))
您需要binary(3)来确保输出字符串的正确长度。
这是错误的。您获得4个十六进制数字,因为0和255在此处是4个字节的int值。
SELECT
    '#' + sys.fn_varbintohexstr(CONVERT(varBINARY(8), 0)),
    '#' + sys.fn_varbintohexstr(CONVERT(varBINARY(8), 255))

2017年10月更新:

自2008年以来,转换现在已内置于SQL Server中!因此我们可以简单地使用CONVERT

SELECT '#' + CONVERT(char(6), CONVERT(BINARY(3), 2570841), 2)

非常感谢您的帮助!我在这两个选项之间没有注意到任何区别。最终,我使用了RIGHT( , 6)来修剪这些函数返回的字符串开头的“0x”,它起作用了!再次感谢。 - user1636130
1
该函数返回的值以0x开头,因此您需要在sys.fn_varbintohexstr周围加上RIGHT(..., 6),使其看起来像#FF00FF - Stoleg
为什么不使用使用CONVERTSELECT CONVERT(VARCHAR(8),CONVERT(VARBINARY(8), 987654321),2)? - ruffin
1
@ruffin:该语法仅在SQL Server 2008中添加。请比较https://msdn.microsoft.com/en-us/library/ms187928(v=sql.90).aspx和https://msdn.microsoft.com/en-us/library/ms187928(v=sql.100).aspx中的“二进制样式”。 OP正在使用SQL Server 2008,但我可能在哪个版本是哪个方面弄混了。 - gbn

2

在SQL SERVER中,从int到varbinary的转换是隐式的,因此您也可以使用SELECT sys.fn_varbintohexstr(1234567)来完成。

但要注意BIGINT值,因为长数字字面量被解释为DECIMAL值而不是BIGINT。小数有前缀数据来保持精确度,字节顺序是反转的,这就是为什么会出现以下结果:

select sys.fn_varbintohexstr(2147483648)

返回 0x0A00000100000080

您需要明确转换为 BIGINT:

select select sys.fn_varbintohexstr(CONVERT(BIGINT(2147483648))

返回 0x0000000080000000


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接