TSQL에서 이진 값을 16진수로 인쇄하려면 어떻게 해야 합니까?
-
09-06-2019 - |
문제
저는 SQL Server 2000을 사용하여 다음을 사용하여 테이블의 일부 값을 인쇄하고 있습니다. PRINT
.대부분의 문자열이 아닌 데이터의 경우 nvarchar로 캐스팅하여 인쇄할 수 있지만 이진 값은 문자의 비트 표현을 사용하여 변환을 시도합니다.예를 들어:
DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT CAST(@binvalue AS nvarchar)
예상되는:
0x12345678
대신 두 개의 횡설수설 문자를 인쇄합니다.
바이너리 데이터의 값을 어떻게 인쇄할 수 있나요?내장되어 있나요? 아니면 직접 굴려야 하나요?
업데이트:이것이 행의 유일한 값이 아니므로 @binvalue를 PRINT할 수는 없습니다.PRINT N'other stuff' + ????에 더 가깝습니다.+ '더 많은 것'.차이가 있는지 확실하지 않습니다.나는 PRINT @binvalue 자체를 시도하지 않았습니다.
해결책
SQL Server 2005를 사용한다면 다음을 사용할 수 있습니다.
print master.sys.fn_varbintohexstr(@binvalue)
하지만 2000년에는 그런 것이 존재하지 않는다고 생각하므로 직접 굴려야 할 수도 있습니다.
다른 팁
사용하지 마세요
master.sys.fn_varbintohexstr
- 그것은 엄청 느림, 문서화되지 않음, 지원되지 않음 및 SQL Server의 향후 버전에서는 사라질 수 있습니다..
변환이 필요한 경우 binary(16)
16진수 문자로 사용하려면 convert
:
convert(char(34), @binvalue, 1)
왜 34입니까?왜냐하면 16*2 + 2 = 34
, 즉 "0x" - 2개의 기호와 각 문자에 대한 2개의 기호입니다.
200,000개의 행이 있는 테이블에 대해 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)
크기(종류) 지정에 대해 걱정할 필요가 없습니다.
변환의 또 다른 예를 보여주는 답변 추가 바이너리 데이터를 16진수 문자열로 변환하고 다시 되돌립니다.
나는 가장 높은 것을 변환하고 싶다 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
이진 데이터를 다음과 같이 처리합니다. 문자 16진수 값 대신 빈 문자열을 반환합니다.
거꾸로 해라
저장된 16진수 문자열을 다시 타임스탬프로 변환하려면 다음을 수행하세요.
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' 함수에서 반환된 16진수 값을 인쇄하는 동안 비슷한 문제에 대한 해결책을 찾는 동안 이 질문을 발견했습니다.
안타깝게도 이 버전의 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