如何将二进制数据转换为文本数据?

时间:2014-06-14 13:33:33

标签: sql-server sql-server-2005

如何将二进制数据转换为文本?

我在测试表中有一个名为文件名的列,带有image数据类型,所以当我从测试表中选择数据时,它显示文件名列的数据是二进制数据,即('0x433A5C55736535')。

此致 安

3 个答案:

答案 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.aspxSELECT * FROM fn_helpcollations())类型时必须要小心,因为它们会影响SQL Server如何将二进制值转换为“弦”。

你可能会看到两个例子:

1)前两行(SELECT * FROM @MyTables)显示为什么“字符串”列的类型很重要:VARCHARNVARCHAR。如果您选择转换为0x433A5C55736535VARCHAR,则可以从相同的源二进制值(NVARCHAR)获得不同的结果。

2)接下来的两行显示了为什么排序规则很重要,因为有时候,相同的“字符串”值(例如)可能因排序规则而有不同的二进制表示形式(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];