2011-03-28 73 views
2

我想在我的应用程序层调试unicode问题。为此,我希望能够以二进制格式(十六进制格式的UTF-8或UTF-16)快速查看MS SQL列(ntext)的内容,以便我可以识别涉及的精确unicode字符。如何选择一个ntext列为二进制/十六进制

为此,我想编写一个查询到的效果:

SELECT CONVERT_TO_UTF16_HEX([mytext]) FROM [mytable] WHERE [id] = 123;

我怎么能去这样做?

(编辑:将首选项更改为UTF16)。

+0

二进制没有UTF-8或16的概念,它只是个字节的二进制 – RichardTheKiwi 2011-03-28 21:13:10

+0

必须有UTF8或UTF16的概念,不是吗?当unicode字符串行化时,必须选择编码。 – DuckMaestro 2011-03-28 21:14:58

+0

大概在C#中。在SQL Server中,不这么认为。对于2个字节的存储空间只有N-var-char,对于1个字节只有非N-1个 – RichardTheKiwi 2011-03-28 21:15:44

回答

3

转换两次,第一次到NVARCHAR(MAX),然后到VARBINARY(MAX)

样品

declare @mytable table (id int, mytext ntext) 
insert @mytable select 123, 'someUNICODEütext' 

SELECT convert(varbinary(max),convert(nvarchar(max),[mytext])) 
FROM @mytable 
WHERE [id] = 123; 
+0

这似乎是有效的。我在十六进制中看到了什么样的UTF-16 ... – DuckMaestro 2011-03-28 21:27:10

1

不正是你所要求的,但它可能会有所帮助。如果将ntext的值设置为nvarchar(max)值,则可以使用递归cte来分割字符,然后使用unicode来获取每个字符的unicode值。

declare @txt as nvarchar(max) 
set @txt = 'abcåäö€' 

;with cte as 
(
    select 
    left(@txt, 1) as c, 
    stuff(@txt, 1, 1, '') as rest 
    union all 
    select 
    left(rest, 1) as c, 
    stuff(rest, 1, 1, '') as rest 
    from cte 
    where len(rest) > 0 
) 
select c, unicode(c) 
from cte 
option (maxrecursion 0) 

结果

---- ----------- 
a 97 
b 98 
c 99 
å 229 
ä 228 
ö 246 
€ 8364 
相关问题