我想在我的應用程序層調試unicode問題。爲此,我希望能夠以二進制格式(十六進制格式的UTF-8或UTF-16)快速查看MS SQL列(ntext)的內容,以便我可以識別涉及的精確unicode字符。如何選擇一個ntext列爲二進制/十六進制
爲此,我想編寫一個查詢到的效果:
SELECT CONVERT_TO_UTF16_HEX([mytext]) FROM [mytable] WHERE [id] = 123;
我怎麼能去這樣做?
(編輯:將首選項更改爲UTF16)。
我想在我的應用程序層調試unicode問題。爲此,我希望能夠以二進制格式(十六進制格式的UTF-8或UTF-16)快速查看MS SQL列(ntext)的內容,以便我可以識別涉及的精確unicode字符。如何選擇一個ntext列爲二進制/十六進制
爲此,我想編寫一個查詢到的效果:
SELECT CONVERT_TO_UTF16_HEX([mytext]) FROM [mytable] WHERE [id] = 123;
我怎麼能去這樣做?
(編輯:將首選項更改爲UTF16)。
轉換兩次,第一次到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;
這似乎是有效的。我在十六進制中看到了什麼樣的UTF-16 ... – DuckMaestro 2011-03-28 21:27:10
不正是你所要求的,但它可能會有所幫助。如果將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
二進制沒有UTF-8或16的概念,它只是個字節的二進制 – RichardTheKiwi 2011-03-28 21:13:10
必須有UTF8或UTF16的概念,不是嗎?當unicode字符串行化時,必須選擇編碼。 – DuckMaestro 2011-03-28 21:14:58
大概在C#中。在SQL Server中,不這麼認爲。對於2個字節的存儲空間只有N-var-char,對於1個字節只有非N-1個 – RichardTheKiwi 2011-03-28 21:15:44