文章編號: 153449 - 上次校閱: 2003年11月17日 - 版次: 3.0

INF: SQL Server 的字碼頁和 AutoAnsiToOem 行為

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

本文將告訴您,在 SQL Server 和如何插入或擷取資料受到啟用或停用 AutoAnsiToOem 設定的字碼頁。

字碼頁也稱為字元設定,是一組 256 大寫和小寫字母、 數字和符號。前 128 個值的可列印的字元是針對所有的字元組選擇相同的。上次 128 字元有時也稱為延伸字元不同組從組。預設的字碼頁為 SQL Server 4.21a 是字碼頁 850 (多國語言)。預設值為 SQL Server 6.0 和 6.5 是 ISO 8859-1 (拉丁文 1 或 ANSI),也稱為字碼頁 1252年。SQL Server 的字碼頁決定的 SQL Server 會辨識您的資料庫和 SQL Server 會傳回涉及字元比較的查詢結果中的字元的類型。

請注意 SQL Server 的字碼頁不同的作業系統的 [程式碼] 頁。Windows NT 和 Windows 95 作業系統有 ANSI 字碼頁和 OEM 字碼頁。ANSI 和 OEM 字碼頁是根據國家/地區設定而定。美式英文的 Windows NT 以和 Windows 95 預設 ANSI 字碼頁為 1252,OEM 字碼頁為 437 (美國 英文)。MS-DOS 僅有 OEM 字碼頁。美式英文此字碼頁會是預設 437。Windows 3.x 執行作為延伸 MS-DOS,而且有預設的 ANSI 字碼頁 1252年。Windows NT 主控台是在內部 Unicode ; 不過,這是一種特殊情況,而且它必須出現在 MS-DOS 字碼頁中執行。因此,Windows NT] 下的主控台應用程式有效地執行 OEM 字碼頁的電腦。不過,參數傳遞至主控台應用程式都是在 ANSI 字碼頁,而非 OEM 字碼頁和因此,AnsiToOem 的翻譯任何命令列所需的主控台應用程式來適當地將參數傳遞至 SQL Server。

登錄項目 AutoAnsiToOem 控制預設轉換行為插入或擷取資料時。如果啟用 AutoAnsiToOem 轉換就會啟用下列情況中:
  • ANSI 至 OEM 伺服器的用戶端
  • ANSI 伺服器的 OEM 用戶端
如果停用 AutoAnsiToOem,轉換已停用所有的連線。

所有 Windows 架構用戶端 (例如 isql/w、 SQL 企業管理員、 傳輸管理員、 SQL 系統管理員和 SQL 物件管理員) 會被視為 ANSI 用戶端。MS-DOS 或如 Isql 和 BCP 主控台為基礎的應用程式被視為 OEM 用戶端。此例外狀況是傳輸資料選項的物件管理員,可作為 OEM 用戶端的行為。

1250 至 1259年一程式碼頁的 SQL Server 會被視為 ANSI 的伺服器,而以任何其他字碼頁 (比方說 850 或 437) 的 SQL Server 會被視為一個 OEM 伺服器。

用來翻譯字元的 OEM 字碼頁目前的 OEM 字碼頁的用戶端的作業系統而定。比方說 AutoAnsiToOem 選項維持在啟用狀態,ANSI 伺服器中的 ASCII 字元 165 ([ASCII 165]) 取得轉換 ASCII 190 ([ASCII 165]) 選取來自以字碼頁 850,OEM 用戶端時,並 ASCII 157 ([ASCII 165]) 時從一個 OEM 用戶端以字碼頁 437 中選取。

其他相關資訊

下表提供概觀其餘部份的本文:
摺疊此表格展開此表格
組件描述
A如何判斷 SQL Server 的字碼頁
B啟用或停用 AutoAnsiToOem
C如何檢查儲存資料的有效性
D時,會發生什麼事字元在單一的程式碼頁面上是在另一個上無法使用
E輸入與美式鍵盤的延伸的字元
F如何變更的 Windows NT 和 Windows 95 OEM 字碼頁
G如何變更 MS-DOS 和 Windows 3.x 的 OEM 字碼頁
H一致的資料的用戶端建議
iMS-DOS Isql.exe 範例
JWin32 Bcp.exe 範例
KIsqlw.exe 範例
L傳輸管理員範例
MODBC 和 ANSI 至 OEM 轉換
NMS 查詢 ODBC 用戶端範例
O其他相關的程式碼頁文件

組件 a: 如何判定 SQL Server 的字碼頁

預存程序 sp_helpsort 來尋找 SQL Server 排序順序及字元集。

組件 b: 啟用或停用 AutoAnsiToOem

登錄項目 AutoAnsiToOem 可以是啟用或停用藉由選取 [用戶端組態公用程式中的 [自動 ANSI 至 OEM] 核取方塊。在 SQL Server 4.21a 自動 ANSI 至 OEM 預設會停用,而 6.0 和 6.5 版本中預設啟用它。

部分 C: 如何檢查儲存資料的有效性

交易的 SQL 字串函數 ASCII(char_expr) 來決定什麼實際儲存在伺服器上。這個函式會顯示 ASCII 程式碼值的最左邊的字元,字元運算式中。如果您 850 的伺服器上儲存的字元"[ASCII 177] 」,例如 isql/w 從選取資料可能會顯示 (當 AutoAnsiToOem 上),字元"[ASCII 177]"[ASCII 241] 」 (當 AutoAnsiToOem 時關閉)。不過,選取 ASCII(<column_name>) 會顯示您 241 (這是 850 字碼頁的"[ASCII 177]")。

一部份 D: 時,會發生什麼事字元在單一的程式碼頁面上是在另一個上無法使用

如果一個轉換,就會發生,且無法使用於另一個字碼頁中的字元,字元取得轉換成其最接近的對等字元,在其他程式碼頁面。比方說在程式碼頁 437 ASCII 224 (alpha) 會轉換成 ANSI 字碼頁的 97("a")。當您將它轉換回字碼頁 437 時,您會收到 97("a")。這是一個問題,因為您現在已經失去原始 224("alpha")。這可能會造成不正確的資料儲存在如發生下列兩個範例中您伺服器上:

範例 1:

您有 OEM 伺服器讓您插入的資料來自 ANSI 用戶端及 AutoAnsiToOem 選項已啟用。如果您正在插入的字元是有效這兩個字碼頁中,會儲存正確的資料。不過,如果字元,則在 ANSI,但是不在 OEM 有效正確的資料將不會儲存。

範例 2:

您將資料從一個 OEM 用戶端的 ANSI 伺服器插入,而且 AutoAnsiToOem 選項會啟用。如果您正在插入的字元是有效這兩個字碼頁中,會儲存正確的資料。不過,如果字元,則在 OEM,而不是在 ANSI 有效再正確的資料不會儲存。


組件 E: 輸入與美式鍵盤的延伸的字元

按下 NUMLOCK,並使用鍵盤右邊的數字鍵台。 若要輸入 ANSI 擴充字元,按住 ALT 鍵,然後再輸入 [ASCII 碼前面加零 (0) 字元。若要輸入 OEM 擴充字元,按住 ALT 鍵,然後輸入只是 ASCII 碼之字元。 例如,輸入 +,按住 ALT 鍵並鍵入 0165,或鍵入 157] (如果用戶端 OEM 字碼頁 437) 或輸入 190 (如果用戶端 OEM 字碼頁是 850)。

部分 F: 如何變更的 Windows NT 和 Windows 95 OEM 字碼頁

Windows NT 3.51 的變更 OEM 字碼頁,在 Windows NT 的慣用的方法是變更在控制台中國際語言。Windows NT 4.0 或 Windows 95,OEM 字碼頁會在初始安裝期間選擇。

此外,[OEM 字碼頁來變更變更 OEMCP 和 OEMHAL (Windows NT) 在下列位置的登錄值:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentlControlSet\Control\Nls\CodePage
				
這些變更生效後重新啟動 Windows NT 或 Windows 95。

OEMCP 值會控制哪些 OEM 的程式碼頁面進行翻譯的 ANSI 及 OEMHAL 值可控制的延伸字元在命令提示字元顯示。一些可能的值,這些登錄值包括:

摺疊此表格展開此表格
OEM 字碼頁OEMCP 值OEMHAL 值
437437vgaoem.fon
850850vga850.fon

除了變更 OEMCP 登錄值,此設定也將改變 OEMHAL 值,控制在命令提示字元中的延伸字元顯示。

部分 G: 如何變更的 MS-DOS 和 Windows 3.x 的 OEM 字碼頁

若要變更的字碼頁的 MS-DOS,請參考第 6 MS-DOS 程式設計參考 6.0 中的國家語言支援。一旦變更 MS-DOS 字碼頁,您必須執行 Windows 安裝程式來變更 ANSI 至 OEM 轉換其 ANSI OEM 轉譯表格。

一致的資料的一部份 H: 用戶端建議

下列建議將有助於確保資料儲存在 SQL Server 上儲存根據為 SQL Server 字碼頁,而不是用戶端字碼頁通常是錯誤的資料的原因。

MS-DOS 用戶端: 因為 MS-DOS 僅有 OEM 字碼頁和沒有 ANSI 字碼頁,會進行任何轉換。因此 SQL Server 的字碼頁應該設為符合用戶端字碼頁在用戶端永遠會在伺服器上使用用戶端 OEM 字碼頁儲存資料。

OEM 和 ANSI 用戶端: 如果執行 SQL Server 的電腦不使用 ANSI 字碼頁,變更符合 SQL Server 字碼頁,並啟用 AutoAnsiToOem 轉換的用戶端 OEM 字碼頁。如果執行 SQL Server 的電腦使用 ANSI 字碼頁,只啟用 AutoAnsiToOem 轉換。

以下是上述建議的例外狀況:


  • 針對 Win32 Bcp.exe 用戶端匯入 [ANSI SQL Server,變更以符合資料以所建立的字碼頁的用戶端字碼頁。
  • 匯出 ANSI SQL Server 從 Win32 Bcp.exe 的用戶端,變更用戶端字碼頁到匯出結果將匯入 SQL Server 的字碼頁。比方說,匯入以字碼頁 850 的 SQL Server,變更 [850 到的 [用戶端字碼頁]。
  • 對於 SQL Server 傳輸管理員 4.2 x 和 6.0 版用戶端變更以符合非 ANSI 字碼頁 SQL Server 的字碼頁的用戶端字碼頁如果這兩個 SQL 伺服器不使用 ANSI 字碼頁。下表摘要說明這:

    摺疊此表格展開此表格
    來源 SQL Server 字碼頁目的地 SQL Server 字碼頁若要使用的用戶端字碼頁
    ANSI437437
    850ANSI850
    850850850
    437850*

    * 當 OEM 字碼頁間轉送,請兩個傳輸來代替:
    OEM1 to ANSI followed by ANSI to OEM2.
    					

部分 i: MS-DOS Isql.exe 範例

中每一個下列的範例資料表於不同的點顯示字元的十進位的對等用法。

在 INSERT 和 SELECT 的 + 頁面 SQL Server 使用 MS-DOS Isql.exe 用戶端,以一個 437 OEM 字碼頁和從 437 的程式碼字元。

摺疊此表格展開此表格
作業用戶端上用戶端轉換在伺服器上
插入157157 *157
選取157157 *157

* 值絕對不會變更從 157,因為 MS-DOS 用戶端並不會執行 AnsiToOem 轉換。

部分 J: Win32 Bcp.exe 範例

範例 1:

匯出及 IMPORT 的 + 850 OEM 字碼頁 850 的程式碼網頁 SQL Server 的字元 Win32 Bcp.exe 用戶端。

摺疊此表格展開此表格
作業用戶端上用戶端轉換在伺服器上
匯入190190 *190
匯出190190 *190

* 因為用戶端和伺服器是 OEM,不會執行轉換。

範例 2:

IMPORT + 字元 Win32 Bcp.exe 用戶端具有 437 OEM 字碼頁和字碼頁 437,以建立到 ANSI 碼頁 SQL Server 的資料。

摺疊此表格展開此表格
作業用戶端上用戶端轉換在伺服器上
匯入157165 *165

* + 轉換為 ANSI 對等用法。

範例 3:

匯出 165 437 的 OEM 字碼頁,與 ANSI 字碼頁,稍後匯入 437 字碼頁 SQL Server [SQL] Server 的字元 Win32 Bcp.exe 用戶端。

摺疊此表格展開此表格
作業在伺服器上用戶端轉換用戶端上
匯出165157 *157

* + 轉換至 OEM 的對等用法。

範例 4:

匯出的 + 以 1252 OEM 字碼頁,從一個 ANSI 字元 Win32 Bcp.exe 用戶端字碼頁稍後匯入到相同的 SQL Server 的 SQL Server。

摺疊此表格展開此表格
作業在伺服器上用戶端轉換用戶端上
匯出165165 *165

* 因為 ANSI 字碼頁符合 OEM 字碼頁,在用戶端,沒有轉換就會發生。

部分 K: Isqlw.exe 範例

範例 1:

在 INSERT 和 SELECT Win16 或 Win32 Isqlw.exe 用戶端至 ANSI 碼頁 SQL Server。

摺疊此表格展開此表格
作業用戶端上用戶端轉換在伺服器上
插入165165 *165
選取165165 *165

* 因為用戶端和伺服器是 ANSI,不會執行轉換。

範例 2:

以插入 437 的程式碼網頁 SQL Server 的 OEM 字碼頁 437 INSERT 和 Win16 SELECT 或 Win32 ISQLW.EXE 用戶端。

摺疊此表格展開此表格
作業用戶端上用戶端轉換在伺服器上
插入165157 *157
選取157165 貴165

* [ASCII 165] 轉換為 OEM 對等用法。
貴 [ASCII 165] 轉換為 ANSI 對等用法。

部分 L: 傳輸管理員範例

範例 1:

SQL Server 傳輸管理員 6.0 兩個 ANSI 字碼頁 SQL Server 之間。

摺疊此表格展開此表格
來源伺服器從來源伺服器的用戶端轉換用戶端轉換成目的地。伺服器目的伺服器
165165 *165 *165

* 因為用戶端和伺服器是 ANSI,不會執行轉換。

範例 2:

SQL Server 傳輸管理員 6.0 以 OEM 字碼頁 437,從 437 的字碼頁 SQL Server 以一個 ANSI 字碼頁 SQL Server。

摺疊此表格展開此表格
來源伺服器從來源伺服器的用戶端轉換用戶端轉換成目的地。伺服器目的伺服器
157165 *165 貴165

* [ASCII 165] 轉換為 ANSI 對等用法。
貴因為用戶端和伺服器是的 ANSI 不會執行轉換。

範例 3:

SQL Server 傳輸管理員 6.0 以 OEM 字碼頁 850,從一個 ANSI 字碼頁 SQL Server 到 850 的字碼頁 SQL Server。

摺疊此表格展開此表格
來源伺服器從來源伺服器的用戶端轉換用戶端轉換成目的地。伺服器目的伺服器
165165 *190 貴190

* 因為用戶端和伺服器是的 ANSI 不會執行轉換。
貴 [ASCII 165] 轉換為 OEM 對等用法。

範例 4:

SQL Server 傳輸管理員 6.0 以到 850 的字碼頁 SQL Server 的 850 字碼頁 SQL Server 的 OEM 字碼頁 850。

摺疊此表格展開此表格
來源伺服器從來源伺服器的用戶端轉換用戶端轉換成目的地。伺服器目的伺服器
190165 *190 貴190

* [ASCII 165] 轉換為 ANSI 對等用法。
貴 [ASCII 165] 轉換為 OEM 對等用法。

部分 M: ODBC 和 ANSI 至 OEM 轉換

ODBC 規格所定義,所有的 ODBC 用戶端 (GUI 和主控台應用程式) 是 ANSI 的用戶端。非 ANSI 字碼頁 SQL Server 只會發生轉譯。ODBC 用戶端有三個轉譯選項: 沒有轉譯翻譯 OEM 字碼頁,或使用 ODBC 程式碼分頁轉譯器。以 OEM 字碼頁轉譯的作用資料程式庫 ANSI 相同 OEM 轉換成,OEM 字碼頁的用戶端決定什麼儲存在伺服器上。藉由選取資料來源設定] 對話方塊中的 ANSI 字元] 核取方塊 ConvertOEM 選取此選項。以使用 ODBC 程式碼分頁轉譯器,再按 [資料來源設定] 對話方塊的 [翻譯] 區段中的 [選取] 按鈕、 按一下 MS 字碼頁轉譯程式,然後選取 [程式碼分頁轉譯程式使用。這個選項會覆寫轉換] OEM ANSI 字元] 核取方塊,並不會根據來選擇而不是 OEM 字碼頁中的轉譯程式,OEM 轉譯。所有的 ODBC 用戶端是 ANSI 用戶端,非 ANSI 字碼頁 SQLservers 轉譯將只會發生。

部分 N: MS 查詢 ODBC 用戶端範例

範例 1:

SELECT MS 查詢與 ANSI 字碼頁 SQL Server 的用戶端。

摺疊此表格展開此表格
在伺服器上用戶端轉換用戶端上
165165 *165

* 因為用戶端和伺服器都 ANSI,不會執行轉換無論其所選擇的轉譯。

範例 2:

以 OEM 字碼頁 437,MS 查詢用戶端的 SELECT 並轉換成 ANSI 字元的 OEM 啟用,從 437 的字碼頁 SQL Server。

摺疊此表格展開此表格
在伺服器上用戶端轉換用戶端上
157165 *165

* 轉換為 ANSI 對等用法。

範例 3:

MS 查詢具有用戶端 OEM 字碼頁 437 轉換成 ANSI 字元的 OEM 啟用和 Windows 拉丁文 1 (1252) 的 SELECT/850 (多國語言-拉丁文 1) MS 字碼頁轉譯程式 850 的程式碼從網頁 SQL Server。

摺疊此表格展開此表格
在伺服器上用戶端轉換用戶端上
190165 *165

* 轉換成 ANSI 相等使用 850 的 OEM 字碼頁,因為要轉譯程式。

部分 O: 其他相關的程式碼頁文章

如需字碼頁和 AnsiToOem 選項的詳細資訊,請參閱下列文件 「 Microsoft 知識庫 」 中:

75435 - Windows, Code Pages, and Character Sets? (http://support.microsoft.com/kb/75435/EN-US/ )
152980 - BUG: AnsiToOem Check Box Does Not Work in 6.0 Transfer Manager? (http://support.microsoft.com/kb/152980/EN-US/ )

這篇文章中的資訊適用於:
  • Microsoft SQL Server 4.21a Standard Edition
  • Microsoft SQL Server 6.0 Standard Edition
  • Microsoft SQL Server 6.5 Standard Edition
關鍵字:?
kbmt kbinfo kbusage KB153449 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:153449? (http://support.microsoft.com/kb/153449/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
Retired KB Article依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。