2012-06-08 41 views
0

我有需要在各種語言和字母來保存數據的數據庫。我使用默認的拉丁語排序規則,但所有文本字段都是Unicode類型(nchar,nvarchar)。韓國(和其他Unicode)字符R2不正確的查詢結果顯示

我可以高興地插入和使用我的前端應用程序從數據庫中檢索Unicode數據,但如果我認爲使用SSMS中的數據,然後我看到的是亂碼!

我可以插入這樣的:

극단적으로 

然後看起來像這樣在SSMS:

극단ì ìœ¼ë¡œ 

,而是由我的前端應用程序,這個檢索:

극단적으로 

現在顯然數據本身存儲正常,但爲什麼SSMS將其顯示爲亂碼?有趣的是,如果我使用SSMS直接編輯數據,並在粘貼上面它,然後將其顯示爲這個(編輯:原來的顯示,而不是箱子的正確的文本轉換自grid to text aleviates我的問題,這部分的結果。):

□□□□□ 

但是,如果我複製並粘貼到文本編輯器弄出來的:

극단적으로 

在嘗試,看看這只是SSMS行爲不端(/由我配置錯誤)我使用MS Access並將其鏈接到我的SQL Server數據庫,但它顯示相同的gibbe像SQL Server一樣。

這個數據庫將容納所有的web應用程序的靜態文本,所以對我來說,能夠查看和編輯容易,不容易完成的數據時,所有你能看到的是這是很重要的:

극단ì ìœ¼ë¡œ 

任何建議將是巨大的,我真的停留在此。

編輯

這是我的數據插入,這是我在PHP此刻做的一個例子:

$con = sqlsrv_connect("(local)", array("Database" => "myDatabase")); 
$SQL = "INSERT INTO TableName (col1,col2) VALUES (N'극단적으로',N'극단적으로')"; 
sqlsrv_query($con,$SQL); 

這是我的數據檢索的例子:

$SQL = "SELECT col1,col2 FROM TableName"; 
$rs = sqlsrv_query($con,$SQL); 
while($row = sqlsrv_fetch_array($rs)){ 
    echo $row["col1"]." ".$row["col2"]."\n"; 
} 

此結果由PHP構成:

극단적으로 극단적으로 

但如果我在該表上運行一個選擇的數據顯示爲SSMS的輸出窗口胡言亂語。

+2

也許增加一個如何在客戶端存儲和檢索數據的例子? – Andomar

+0

@Andomar在php中只使用SQL查詢,但直接在SSMS中運行查詢具有相同的效果,除了'SELECT'之外,您在SSMS中獲取亂碼並在php中輸出正確。我不確定這會有幫助,但我會在一秒鐘內添加一個示例。 – Ben

+2

如果在編碼和解碼過程中犯了同樣的錯誤,則兩者可以抵消。但是SQL Server只會看到錯誤編碼的版本。 – Andomar

回答

2

我知道這是一個老問題,但我看不到分辨率對於這個問題,我剛剛開始在SSMS中遇到同樣的問題。我不相信這個問題是基於PHP編碼的,如果結果被視爲文本而不是網格,那麼問題就解決了(我經歷了同樣的行爲)。我認爲這個問題實際上是SSMS和網格輸出的編碼,因爲即使SSMS可以正確顯示韓文字符當被視爲文本。

我已經設法通過將字體更改爲「Arial Unicode MS」來解決SSMS中的問題。但是我注意到這個問題已經出現在其他應用程序中,尤其是文本編輯器,例如Notepad ++和Notepad。

以下文章似乎包含一個更永久性的問題解決方案(但是我在網絡計算機上沒有足夠的權限來驗證它)。

sql server management console doesn't work with multi-byte characters

注:我一直在使用,在過去6周的SQL Server韓國/朝鮮文的數據,而不會遇到這個問題。它只是今天發生,我已經有Windows更新,但行爲改變沒有其他原因。我以前也使用過這種查看/查詢過的數據,而沒有更新過的表格沒有問題,並且肯定編碼爲NVARCHAR。我的韓國同事仍然可以在SSMS網格輸出中正確查看數據。

我希望這可以幫助任何人在這個問題上磕磕絆絆。

4

因此,它看起來就像你有一個字符串的PHP文件中的文字:

$SQL = "INSERT INTO TableName (col1,col2) VALUES (N'극단적으로',N'극단적으로')"; 

看一看this post


以下是一些您可能需要知道的事情:

  1. 安裝Debian(Lenny/Squeeze)的mssql支持:

    apt-get install php5-sybase 
    
  2. 當你得到這個錯誤信息: 「在僅Unicode歸類或ntext數據Unicode數據不能被髮送到使用DB-Library(如ISQL)或ODBC 3.7或更早版本的客戶端。」

    在/etc/freetds/freetds.conf添加這兩條線(去年二):

    [global] 
    ;tds version = 4.2 
    tds version = 8.0 
    client charset = UTF-8 
    

    您可以編輯在php.ini「字符集」太(但如果你沒有,你不需要它以前在freetds.conf):

    ; Specify client character set.. 
    ; If empty or not set the client charset from freetds.comf is used 
    ; This is only used when compiled with FreeTDS 
    mssql.charset = "UTF-8" 
    
  3. 使用的nchar/nvarchar的/ ntext列類型,如果你需要的Unicode支持。

+0

對不起,我應該說我正在使用Windows 7機器 – Ben

+0

@本:freetds.conf應該仍然在某個地方,無論是在C:\或在'FREETDS'環境變量的目錄中。 – Andomar

+0

我無法找到feetds.conf,所以我只是編輯了php.ini文件,但我沒有任何區別,不幸的是 – Ben

1

극단ì ìœ¼ë¡œ是Windows拉丁語顯示1.所以我想SSMS未配置爲顯示UTF-8的극단적으로 ...

+0

SQL Server無法存儲UTF-8。 'nvarchar'列是UCS-2,'char'列是單字節編碼。所以驅動程序必須在將UTF-8傳輸到SQL Server之前將其轉換爲UCS-2。 – Andomar

+0

我不會做MS SQL,所以我會相信你。可以肯定的是,在UTF-8中顯示爲'극단적으로',顯示爲Windows拉丁語1.因此,存儲的字節是一系列被錯誤解釋的UTF-8碼點。 – dda

+0

@Andomar所以不知怎的,我需要告訴SSMS停止嘗試顯示這些列爲Latin1 ..... – Ben