2013-01-07 33 views
0

我有一個名爲mydata的類型爲nvarchar(max)的字段的表。這包含字符如:éáñ。 使用Java(Spring)提取數據。 java應用程序使用utf-8來請求和響應。SQL Server函數返回 爲特殊字符utf-8

當我執行一個簡單的選擇特殊字符顯示正確。

Select myData from myTable 

我有剛剛收到一個nvarchar的,並返回它簡單的SQL函數。

CREATE function getIt (@mydata nvarchar(max)) 
returns nvarchar(max) 
as 
begin 
    return @mydata; 
end 

當我使用一個函數將特殊字符不顯示,並用符號代替。

Select dbo.getIt(myData) as myData from myTable 

我使用mySQL和Oracle測試了相同的進程,在這種情況下,SQL函數不會更改特殊字符。 我在Ubuntu Linux中使用Tomcat。數據庫是SQL Sever 2005.我正在使用JDTS 1.3。

謝謝你的幫助。

額外說明

如果該字段myData的包含如N,如果執行此:

Select 
myData, 
dbo.getIt(myData) as myData2 
from myTable 

在網頁中顯示的列的結果將是N?或ñ NVarchar存儲數據正確,但由於某種原因該函數改變了一些東西。 如果我遇到編碼問題,在兩種情況下都不會正確顯示。

+1

您是否100%確定數據庫中的數據是正確的?你的輸出在哪裏?你究竟在哪裏看到'?'而不是那些特殊字符? – jlordo

+0

@jlordo 100%確定數據庫中的數據是正確的,SQL Server Manager Studio在有和沒有函數的情況下正確顯示它。輸出是一個Web應用程序,我看到的是?取而代之的是,只有當數據被函數返回時,否則它在網頁中顯示OK。 – italo

+0

你能否以某種方式縮小錯誤的根源?例如。在將值顯示在網頁上之前將其記錄下來:如果日誌中出現錯誤,則表明函數返回錯誤,如果日誌中正確,則Web應用程序會將其搞亂。但要小心實施正確的日誌記錄,以避免錯誤的否定。 – jlordo

回答

1

我得到了問題。

出於某種原因,經常選擇爲nvarchar的是捕獲由JDBO爲類型(12)VARCHAR。 但是也返回一個nvarchar的函數被捕獲爲類型爲(-1)的LONGVARCHAR。

MySQL和以不同的方式甲骨文的工作和我的Java代碼最初是爲這個數據庫。

另一種情況是,nVarchar(400)將返回類型(12)VARCHAR,但nVarchar(MAX)將返回類型(-1)LONGVARCHAR。

我的代碼正在處理所有「LONG」值作爲二進制文件並在此循環中輸入SQL Server。

謝謝@jlordo和@chooban指導我解決問題。

+0

有多奇怪。如果我曾經使用SQL Server,我會記住這一點。 – chooban

0

這是Unicode替換字符。如果你告訴應用程序解釋從數據庫爲UTF-8字節,但拉丁-1(或其他字符集)提供它可能會發生。我認爲nvarchar意味着數據存儲爲UTF-16,對吧?我不太在SQL服務器上。

一旦您完成了對數據庫的連接,解釋元數據的連接,並看到正在使用的字符集。

您還應該檢查列中存儲的內容。在MySQL中,我使用了十六進制函數來精確顯示字段中的字節,但我不確定SQL Server等效的內容。然而,this page告訴我有LENDATALENGTH可用於字符數與字節數比較功能。找到相當於MySQL的十六進制函數絕對是g的方法。