题
我正在使用 SQL Server 2000 从表中打印出一些值 PRINT
. 。对于大多数非字符串数据,我可以转换为 nvarchar 以便能够打印它,但二进制值尝试使用字符的位表示形式进行转换。例如:
DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT CAST(@binvalue AS nvarchar)
预期的:
0x12345678
相反,它会打印两个乱码。
如何打印二进制数据的值?有内置的还是我需要自己构建?
更新:这不是该行的唯一值,因此我不能只打印@binvalue。它更像是 PRINT N'other stuff' + ????+ N'更多的东西'。不确定这是否有什么不同:我没有尝试单独打印 @binvalue 。
解决方案
如果您使用的是 Sql Server 2005,您可以使用以下命令:
print master.sys.fn_varbintohexstr(@binvalue)
不过,我认为 2000 年不存在这种情况,因此您可能必须自己推出。
其他提示
不使用
master.sys.fn_varbintohexstr
- 这是 非常慢, 、无证、不受支持,以及 可能会在 SQL Server 的未来版本中消失.
如果您需要转换 binary(16)
为十六进制字符,使用 convert
:
convert(char(34), @binvalue, 1)
为什么是34?因为 16*2 + 2 = 34
, ,即“0x”- 2 个符号,加上每个字符 2 个符号。
我们尝试对包含 200000 行的表进行 2 次查询:
select master.sys.fn_varbintohexstr(field) from table`
select convert(char(34), field, 1) from table`
第一个运行 2 分钟,第二个运行 4 秒。
select convert(varchar(max), field , 1)
from table
经过 using varchar(max)
您不必担心指定尺寸(某种程度)。
添加显示另一个转换示例的答案 二进制 数据转换为十六进制字符串,然后再返回。
我想转换最高的 timestamp
值转化为 varchar
:
SELECT
CONVERT(
varchar(50),
CAST(MAX(timestamp) AS varbinary(8)),
1) AS LastTS
FROM Users
返回:
LastTS
==================
0x000000000086862C
笔记:重要的是你使用 CONVERT
转换 varbinary -> varchar
. 。使用 CAST
不管用:
SELECT
CAST(
CAST(MAX(timestamp) AS varbinary(8))
AS varchar(50) ) AS LastTS
FROM Users
将把二进制数据视为 人物 而不是十六进制值,返回空字符串。
反转它
要将存储的十六进制字符串转换回时间戳:
SELECT CAST(CONVERT(varbinary(50), '0x000000000086862C', 1) AS timestamp)
笔记:任何代码都会发布到公共领域。无需归属。
DECLARE @binvalue binary(4)
SET @binvalue = 0x61000000
PRINT @binvalue
PRINT cast('a' AS binary(4))
PRINT cast(0x61 AS varchar)
不要施放。
转换根据特定数据库的相应排序规则设置上的值将二进制文件转换为文本。
开始编辑]如果您需要字符串变量中的打印值,请使用Eric Z Beard建议的功能。
DECLARE @mybin1 binary(16)
DECLARE @s varchar(100)
SET @mybin1 = 0x098F6BCD4621D373CADE4E832627B4F6
SET @s = 'The value of @mybin1 is: ' + sys.fn_varbintohexsubstring(0, @mybin1,1,0)
PRINT @s
如果由于服务器版本或需要特殊权限而无法使用此函数,您可以创建自己的函数。
要查看该功能在 SQL Server 2005 Express 版本中是如何实现的,您可以执行:
sp_helptext 'fn_varbintohexsubstring'
我在打印 SQL Server 2005 中“hashbytes”函数返回的十六进制值时寻找类似问题的解决方案时遇到了这个问题。
遗憾的是,在此版本的 SQL Server 中,CONVERT 似乎根本不起作用,只有 fn_varbintohexsubstring 执行正确的操作:
我做了:
DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT 'cast(@binvalue AS nvarchar): ' + CAST(@binvalue AS nvarchar)
PRINT 'convert(varchar(max), @binvalue, 0): ' + CONVERT(varchar(max), @binvalue, 0)
PRINT 'convert(varchar(max), @binvalue, 1): ' + CONVERT(varchar(max), @binvalue, 1)
PRINT 'convert(varchar(max), @binvalue, 2): ' + CONVERT(varchar(max), @binvalue, 2)
print 'master.sys.fn_varbintohexstr(@binvalue): ' + master.sys.fn_varbintohexstr(@binvalue)
这是我在 SQL Server 2005 中得到的结果(
cast(@binvalue AS nvarchar): 㐒硖
convert(varchar(max), @binvalue, 0): 4Vx
convert(varchar(max), @binvalue, 1): 4Vx
convert(varchar(max), @binvalue, 2): 4Vx
master.sys.fn_varbintohexstr(@binvalue): 0x12345678
(实际上在“4Vx”之前有一个无法打印的字符 - 我会发布一张图像,但我还没有足够的点)。
编辑:只是补充一下 - 在 SQL Server 2008 R2 上,CONVERT 的问题已通过以下输出修复:
cast(@binvalue AS nvarchar): 㐒硖
convert(varchar(max), @binvalue, 0): 4Vx
convert(varchar(max), @binvalue, 1): 0x12345678
convert(varchar(max), @binvalue, 2): 12345678
master.sys.fn_varbintohexstr(@binvalue): 0x12345678