如何将二进制数据转换为文本?
我在测试表中有一个名为文件名的列,带有image数据类型,所以当我从测试表中选择数据时,它显示文件名列的数据是二进制数据,即('0x433A5C55736535')。
此致 安
答案 0 :(得分:2)
您可以使用CONVERT
函数进行从VARBINARY
到[N][VAR]CHAR
的显式转换
SELECT CONVERT(VARCHAR(MAX), 0x433A5C55736535) AS Test1
SELECT CONVERT(NVARCHAR(MAX), 0x433A5C55736535) AS Test2
/*
Test1
-------
C:\Use5
Test2
-------
㩃啜敳5
*/
或者你可以依赖隐式转换。根据{{3}}(Implicit Conversions
部分),允许从VARBINARY
到[N][VAR]CHAR
进行隐式转换。在这两种情况下,当您选择“字符串”列([N][VAR]CHAR
)和http://msdn.microsoft.com/en-us/library/ms187928.aspx(SELECT * FROM fn_helpcollations()
)类型时必须要小心,因为它们会影响SQL Server如何将二进制值转换为“弦”。
1)前两行(SELECT * FROM @MyTables
)显示为什么“字符串”列的类型很重要:VARCHAR
与NVARCHAR
。如果您选择转换为0x433A5C55736535
或VARCHAR
,则可以从相同的源二进制值(NVARCHAR
)获得不同的结果。
2)接下来的两行显示了为什么排序规则很重要,因为有时候,相同的“字符串”值(例如AŞ
)可能因排序规则而有不同的二进制表示形式(SQL_Romanian_CP1250_CI_AS
vs. { {1}})。
SQL_Latin1_General_CP1254_CI_AS
因此,做一些测试并选择正确的类型(DECLARE @MyTable TABLE (
VarBinaryCol VARBINARY(MAX),
VarCharCol_RO VARCHAR(MAX) COLLATE SQL_Romanian_CP1250_CI_AS,
VarCharCol_TR VARCHAR(MAX) COLLATE SQL_Latin1_General_CP1254_CI_AS,
NVarCharCol_RO NVARCHAR(MAX) COLLATE SQL_Romanian_CP1250_CI_AS,
NVarCharCol_TR NVARCHAR(MAX) COLLATE SQL_Latin1_General_CP1254_CI_AS
);
INSERT @MyTable (VarBinaryCol) VALUES (0x433A5C55736535);
INSERT @MyTable (VarBinaryCol) VALUES (0x43003A005C005500730065003500);
INSERT @MyTable (VarBinaryCol) VALUES (0x41AA);
INSERT @MyTable (VarBinaryCol) VALUES (0x41DE);
UPDATE @MyTable
SET VarCharCol_RO = VarBinaryCol,
VarCharCol_TR = VarBinaryCol,
NVarCharCol_RO = VarBinaryCol,
NVarCharCol_TR = VarBinaryCol;
SELECT *
FROM @MyTable;
/*
-- Why is important the type of "string" column ?
VarBinaryCol VarCharCol_RO VarCharCol_TR NVarCharCol_RO NVarCharCol_TR
------------------------------ ------------- ------------- ----------------- --------------
0x433A5C55736535 C:\Use5 C:\Use5 㩃啜敳5 㩃啜敳5
0x43003A005C005500730065003500 C : \ U s e 5 C : \ U s e 5 C:\Use5 C:\Use5
-- Why is important the COLLATION of "string" column ?
VarBinaryCol VarCharCol_RO VarCharCol_TR NVarCharCol_RO NVarCharCol_TR
------------------------------ ------------- ------------- ----------------- --------------
0x41AA AŞ Aª ꩁ ꩁ
0x41DE AŢ AŞ � �
*/
)和整理。
注意:请不要使用[N][VAR]CHAR
数据类型,因为它们已被弃用。
答案 1 :(得分:0)
' 0x433A5C55736535'不是二进制数据,二进制数据仅由0和1组成。
我认为您需要使用测试表中定义的函数来获取所需的数据,如果您使用的是MySQL,则需要选择*来自文件名"
答案 2 :(得分:0)
我无法相信没有人回答这个问题。如果是图像数据,您将无法获得任何可读信息。但如果它是二进制字段中的文本数据,您可以这样做:
select cast(DataColumn as varchar(MAX)) as DataAsText from [TableWithData];