原始產品版本:SQL Server
原始 KB 編號: 904803
徵兆
請參考下列案例:
您可以使用 SQL Server Management Studio,從使用非 Unicode 數據類型的 SQL Server 資料庫查詢字元數據。 例如,SQL Server 資料庫會使用
char、varchar或text資料類型。用戶端電腦的代碼頁與資料庫的代碼頁不同。 代碼頁與資料庫的定序相關聯。
在此案例中,字元數據不正確地表示。
例如,您可能會遇到下列其中一個問題:
字元數據會以問號表示(
?)。 如果您在查詢字元數據之前,將字元數據插入或更新為非 Unicode 資料類型,您可能會看到這個問題。 如果您在具有不同代碼頁的用戶端計算機上使用 SQL Server Management Studio 進行這項變更,就會發生此問題。字元數據會表示為損毀的數據。 代碼頁 X 的字元數據會儲存在代碼頁 Y 的非 Unicode 資料行中。此外,不會轉譯字元數據。 當您使用 SQL Server Management Studio 查詢字元數據時,就會發生此問題。
注意
當您使用 SQL Server Management Studio 查詢字元數據時,如果停用字元數據設定(也稱為
Auto Translate參數)的 [執行轉譯] ,則會正確表示字元數據。 參數Auto Translate是ConnectionStringMicrosoft OLE DB Provider for SQL Server 和 Microsoft .NET Framework Data Provider for OLE DB 之 属性的參數。
原因
發生此問題的原因是代碼頁 X 的字元資料會儲存在不支援的代碼頁 Y 的非 Unicode 資料行中。
在 SQL Server 中,當您使用非 Unicode 數據類型的字串常值時,會使用衍生自資料庫定序的資料庫預設代碼頁來轉換字串常值。 將代碼頁 X 的字元資料儲存在代碼頁 Y 的數據行中,可能會導致數據遺失或數據損毀。
如果字元數據表示為損毀的數據,則只有在停用 Auto Translate Microsoft OLE DB Provider for SQL Server 或 Microsoft .NET Framework Data Provider for OLE DB 的參數時,才能正確表示數據。
注意
SQL Server Management Studio 會使用 Microsoft .NET Framework Data Provider for SQL Server 連線到 SQL Server 資料庫。 此數據提供者不支持 Auto Translate 參數。
因應措施
若要解決此問題,請使用下列其中一種方法:
方法 1:使用 Unicode 資料類型,而不是非 Unicode 數據類型
將數據行變更為 Unicode 數據類型,以避免代碼頁轉譯所造成的所有問題。 例如,使用 nchar、 nvarchar或 ntext 資料類型。
方法 2:針對資料庫使用適當的定序
如果您必須使用非 Unicode 資料類型,請務必確定資料庫代碼頁和任何非 Unicode 資料行的代碼頁可以正確儲存非 Unicode 數據。 例如,如果您想要儲存代碼頁 949 (韓文) 字元數據,請使用資料庫的韓文定序。 例如,使用 Korean_Wansung_CI_AS 資料庫的定序。
方法 3:使用 “binary” 或 “varbinary” 數據類型
如果您想要讓資料庫直接儲存並擷取所處理之字元的確切位元組值,而不嘗試執行適當的代碼頁轉譯,請使用 binary 或 varbinary 數據類型。
方法 4:使用不同的工具來儲存和擷取數據,並停用 「自動翻譯」參數
警告
我們不會測試或支援將代碼頁 X 的字元資料儲存在代碼頁 Y 的數據行中。這項作業可能會導致語言上不正確的查詢結果、不正確的字串比對或排序,以及非預期的代碼頁轉譯(數據損毀)。 建議您使用其他其中一種方法來解決此問題。
當您使用 Microsoft OLE DB Provider for SQL Server 連線到具有不同代碼頁的資料庫,並嘗試從非 Unicode 數據類型數據行查詢字元數據時,請確定您將未轉譯的字元儲存在資料庫中。
注意
下列範例假設用戶端計算機的代碼頁是韓文 (CP949),而且 SQL Server 資料庫的代碼頁是英文 (CP1252)。 您必須將程式代碼範例中的佔位元取代為適合您情況的值。
若要解決此問題,請依照下列步驟執行:
使用資料庫的代碼頁,手動將字元轉換成原始數據,然後將數據插入資料庫中。 若要執行這項作業,請使用類似下列代碼段的代碼段:
string strsrc="가";string strsrc="가"; string strtag=Encoding.GetEncoding(1252).GetString(Encoding.GetEncoding(949).GetBytes (strsrc)); sql="insert into <tablename> (<column>,) values ('" + strtag + "')"; // code for updating the database;當您想要查詢資料時,請使用 Microsoft OLE DB Provider for SQL Server 或 Microsoft .NET Framework Data Provider for SQL Server 連接到資料庫,然後將 參數設定
Auto Translate為False。 若要執行這項作業,請使用類似下列代碼段的代碼段:OleDbConnection conn=new OleDbConnection("Provider=SQLOLEDB;" + " Initial Catalog =<yourdatabase>;"+ "User id=<youruserid>; Password=<yourpassword>;"+ "Auto Translate=False"); // code for representing the character data;
其他相關資訊
若要重現問題,請遵循下列步驟:
在具有韓文 (CP949) 作為預設代碼頁的用戶端電腦上,啟動 SQL Server Management Studio。
連接到具有英文 (CP1252) 做為預設代碼頁的資料庫。
使用下列查詢在資料庫中建立資料表:
CREATE TABLE tbTest (A char(20), NA nchar(10), Comment char(20))使用下列查詢將韓文字元插入資料庫中:
INSERT INTO tbTest (A,NA,Comment) VALUES('가',N'가','SQLServer/INSERT')使用下列查詢建立選取查詢以擷取資料:
SELECT * FROM tbTest
您會收到下列結果。 數據行 A 中的值是問號。
A NA Comment
-------------------- ---------- --------------------
? 가 SQLServer/INSERT