字元數據,例如以 SQL_C_CHAR 宣告的 ANSI 字元變數,或使用 char、 varchar 或 text 數據類型儲存在 SQL Server 中的數據,只能代表有限的字元數。 使用每個字元一個字節儲存的字元數據只能代表 256 個字元。 儲存在SQL_C_CHAR變數中的值會使用用戶端電腦的 ANSI 代碼頁 (ACP) 來解譯。 使用伺服器 ACP 評估伺服器上使用 char、 varchar 或 text 資料類型儲存的值。
如果伺服器和用戶端都有相同的 ACP,則解譯儲存在 SQL_C_CHAR、 char、 varchar 或 text 物件中的值並沒有任何問題。 如果伺服器和用戶端有不同的 ACL,則如果用戶端用於 char、 varchar 或 text 數據行、變數或參數,則來自客戶端的數據SQL_C_CHAR可能會解譯為伺服器上的不同字元。 例如,包含值0xA5的位元元組會解譯為字元 ?? 在使用代碼頁 437 的計算機上,在執行代碼頁 1252 的計算機上解譯為日元符號(??)。
Unicode 數據會使用每個字元的兩個字節來儲存。 Unicode 規格涵蓋所有擴充字元,因此所有計算機都會解譯所有 Unicode 字元。
SQL Server Native Client ODBC 驅動程式的 AutoTranslate 功能會嘗試將在用戶端與具有不同代碼頁的伺服器之間移動字元數據的問題降到最低。 AutoTranslate 可以在 SQLDriverConnect 的連接字串、 SQLConfigDataSource 的組態字串中,或使用 ODBC 系統管理員設定 SQL Server Native Client ODBC 驅動程式的數據源時設定。
當 AutoTranslate 設定為 「no」時,不會對用戶端上的SQL_C_CHAR變數與 SQL Server 資料庫中 的 char、 varchar 或 text 數據行、變數或參數之間行動的數據進行轉換。 如果數據包含擴充字元,而且兩部計算機有不同的代碼頁,則客戶端和伺服器計算機上可能會以不同的方式解譯位模式。 如果兩部計算機都有相同的代碼頁,數據將會解譯為相同。
當 AutoTranslate 設定為 “yes”時,SQL Server Native Client ODBC 驅動程式會使用 Unicode 來轉換在用戶端和 char、 varchar 或 text 數據行、變數或參數 SQL_C_CHAR之間移動的數據:
當數據從用戶端上的SQL_C_CHAR變數傳送至 SQL Server 資料庫中的 char、 varchar 或 text 資料行、變數或參數時,ODBC 驅動程式會先使用用戶端的 ACP 從 SQL_C_CHAR 轉換為 Unicode,然後使用伺服器的 ACP 從 Unicode 轉換回字元。
當數據從 SQL Server 資料庫中 的 char、 varchar 或 text 數據行、變數或參數傳送至用戶端上的 SQL_C_CHAR 變數時,SQL Server Native Client ODBC 驅動程式會先使用伺服器的 ACP 從字元轉換成 Unicode,然後使用用戶端的 ACP 從 Unicode 轉換回SQL_C_CHAR。
由於所有這些轉換都是由在用戶端上執行的 SQL Server Native Client ODBC 驅動程式所完成,因此伺服器 ACP 必須是用戶端電腦上安裝的其中一個代碼頁。
透過 Unicode 進行字元轉換可確保正確轉換存在於這兩個代碼頁中的所有字元。 不過,如果字元存在於一個代碼頁中,但不存在於另一個代碼頁中,則無法在目標代碼頁中表示字元。 例如,代碼頁 1252 具有註冊商標符號 (??),而代碼頁 437 則沒有。
AutoTranslate 設定不會影響這些轉換:
在字元SQL_C_CHAR用戶端變數與 SQL Server 資料庫中 的 Unicode nchar、nvarchar 或 ntext 數據行、變數或參數之間行動數據。
在 Unicode SQL_C_WCHAR用戶端變數與 SQL Server 資料庫中的字元 char、 varchar 或 text 資料行、變數或參數之間行動數據。
從字元移至 Unicode 時,數據一律必須轉換。