欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
理解 DB2 Universal Database 的字符轉換
2005 年 6 月 27 日
學(xué)習 DB2 Universal Database(DB2 UDB)如何處理字符轉換。本文首先將討論字符代碼的基本概念,包括代碼頁(yè)、代碼點(diǎn)和編碼模式,接著(zhù)將更為詳細地解釋如何設置代碼頁(yè)以及如何發(fā)生字符轉換。為了易于理解,本文還展示了一些通用的場(chǎng)景和示例。
在當今世界中,許多數據庫應用程序都在多個(gè)平臺上使用多個(gè)數據庫組件。數據庫應用程序可以在 Windows 系統上運行,但卻通過(guò) AIX 上所運行的 DB2 Connect 服務(wù)器與 DB2 UDB for z/OS 數據庫進(jìn)行交互。在這些不同服務(wù)器之間流動(dòng)的信息可能經(jīng)歷多次字符轉換,而且大多數情況下,這些轉換對用戶(hù)是透明的。
然而,偶爾也需要進(jìn)行一些配置。在這些情況中,理解這些轉換如何工作以及哪個(gè)組件處理它們就十分有用。例如,請考慮以下情況:
“我在 SPUFI 中 DB2 UDB for OS/390 表的一列里存儲了感嘆號(?。?。當我從 DB2 UDB for Linux,UNIX and Windows 命令行處理器(CLP)檢索同一列時(shí),感嘆號就轉換成為一個(gè)方括號(])?!?div style="height:15px;">
“我的 DB2 UDB for Linux,UNIX and Windows 數據庫中有西班牙語(yǔ)(Spanish)信息。Java 應用程序檢索這些西班牙語(yǔ)數據(重音符號),但它們都遭到了損壞,即使我可以用 CLP 看到正確內容?!?div style="height:15px;">
這些例子都是來(lái)自于 DB2 UDB 客戶(hù)的疑問(wèn)和問(wèn)題。本文通過(guò)描述 DB2 UDB 字符轉換過(guò)程,解決了所有這些以及類(lèi)似的問(wèn)題。
本文重點(diǎn)關(guān)注下列產(chǎn)品和版本:DB2 UDB for Linux, UNIX, and Windows version 8.2、DB2 UDB for iSeries 5.3 和 DB2 UDB for z/OS version 8。本文可能也適用于這些產(chǎn)品的早期版本。
為了理解字符轉換過(guò)程如何工作,您需要理解一些關(guān)鍵概念。圖 1、2 和 3 提供了其中一些概念的概述。
在這些圖中,每個(gè)頁(yè)碼中的實(shí)線(xiàn)陰影邊框表示的是十六進(jìn)制數。
代碼頁(yè)(code page)可以定義為字母數字代碼及其二進(jìn)制表示的映射表。圖 1 展示了幾個(gè)用于不同語(yǔ)言和平臺的代碼頁(yè)。在本圖中,對于代碼頁(yè) 1252,字母“K”可以用二進(jìn)制數“01001011”(或十六進(jìn)制表示法:“4B”)表示。而在另一代碼頁(yè)中,則可能用不同的二進(jìn)制表示來(lái)表示這同一字符。
代碼點(diǎn)(code point)是字符在代碼頁(yè)中的位置。在圖 1 中,代碼頁(yè) 1252 中的代碼點(diǎn)“4B”對應字符“K”。
字符集(character set)是一個(gè)定義的字符集。例如,一個(gè)字符集可以由大寫(xiě)字母 A 到 Z、小寫(xiě)字母 a 到 z 以及數字 0 到 9 組成。該字符集可以在多個(gè)代碼頁(yè)中重復。例如,在圖 1圖 2 中,不同代碼頁(yè)中帶點(diǎn)背景的單元格都表示同一字符集。
代碼頁(yè)可以分成下列幾類(lèi):
單字節代碼頁(yè)(有時(shí)稱(chēng)作單字節字符集或 SBCS)是一個(gè)最多可以容納 256 (28) 個(gè)代碼點(diǎn)的代碼頁(yè)。SBCS 中代碼點(diǎn)的實(shí)際數目可能要少一些。例如,對于地域標識符 US 和代碼集 ISO 8859-1,AIX 上的地區 en_US 就是 SBCS 代碼頁(yè) 819。
雙字節代碼頁(yè)(有時(shí)稱(chēng)作雙字節字符集或 DBCS)是一個(gè)最多可以容納 65536 (216) 個(gè)代碼點(diǎn)的代碼頁(yè)。DBCS 中代碼點(diǎn)的實(shí)際數目可能要少一些。例如,對于地域標識符 JP 和代碼集 IBM-932,AIX 上的地區 Ja_JP 就是 DBCS 代碼頁(yè) 932。
復合或混合代碼頁(yè)包含不止一個(gè)代碼頁(yè)。例如,Extended UNIX Code(EUC)代碼頁(yè)可以包含多達四個(gè)不同的代碼頁(yè),其中第一個(gè)代碼頁(yè)總是單字節的。例如,用于日語(yǔ)的 IBM-eucJP(代碼頁(yè) 954)根據 EUC 編碼規則引用日本工業(yè)標準(Japanese Industrial Standard)字符的編碼。
在大型機(z/OS, OS/390)和 iSeries(i5/OS、OS/400)領(lǐng)域中,使用術(shù)語(yǔ)編碼字符集標識符(Coded Character Set Identifier,CCSID)來(lái)代替代碼頁(yè)。CCSID 是一個(gè) 16 位的無(wú)符號整數,惟一地標識一個(gè)特定的代碼頁(yè)。例如,在大型機上,US-English 代碼頁(yè)由 CCSID 37 表示。German 代碼頁(yè)是 CCSID 273。其中一些代碼頁(yè)包含了其語(yǔ)言中特定字符的代碼點(diǎn);一些代碼頁(yè)具有相同的字符,但由不同 CCSID 中的不同代碼點(diǎn)來(lái)表示。CCSID 是基于字符數據表示架構(Character Data Representation Architecture,CDRA)的,這是一個(gè) IBM 架構,其中定義了一組標識符、資源、服務(wù)和約定以在異構環(huán)境中取得圖形字符數據的一致表示、處理和交換。OS/400 完全支持 CDRA。OS/390 支持 CDRA 的部分元素。
編碼模式(encoding scheme)是為在特定計算平臺上所使用的不同語(yǔ)言提供的代碼頁(yè)集合。常見(jiàn)的編碼模式有:
American Standard Code for Information Interchange(ASCII),用于基于 Intel 的平臺(如 Windows)和基于 UNIX 的平臺,如 AIX。圖 1 展示了 ASCII 編碼模式的簡(jiǎn)化表示。
Extended Binary Coded Decimal Information Code(EBCDIC),這是由 IBM 設計的編碼模式。它通常用于 z/OS 和 iSeries 上。圖 2 展示了 EBCDIC 編碼模式的簡(jiǎn)化表示。
Unicode 字符編碼標準是固定長(cháng)度的字符,它為世界上的每一個(gè)字符都提供了一個(gè)惟一的代碼點(diǎn),無(wú)論平臺、程序或語(yǔ)言如何。它包含近 100,000 個(gè)字符,并且還在增加。Unicode 標準已經(jīng)為很多行業(yè)巨頭所采用,如 IBM、Microsoft 以及其他許多公司。諸如 XML、Java、LDAP、CORBA 3.0 等現代標準都要求使用 Unicode,它還是實(shí)現 ISO/IEC 10646 的官方方式。圖 3 展示了 Unicode 編碼模式的簡(jiǎn)化表示。
通過(guò)前面的討論,應該已經(jīng)清楚“代碼頁(yè)”的概念對于理解字符轉換至關(guān)重要??梢栽诓煌墑e上定義代碼頁(yè):
在應用程序所運行的操作系統上
在應用程序級別上,根據編程語(yǔ)言使用特定語(yǔ)句
在數據庫所運行的操作系統上
在數據庫級別上
在 Windows 上,代碼頁(yè)派生于 Windows 注冊表中的 ANSI 代碼頁(yè)設置。您可以從 Regional Settings 控制面板查看您的設置。圖 4 展示了一臺 Windows XP 機器上的區域設置。
在基于 UNIX 的環(huán)境中,代碼頁(yè)派生于地區(locale)設置。命令 locale 可以用于確定該值,如圖 5 中所示。命令 localedef 可以編譯新的 locale 文件,而 /etc/environment 中的 LANG 變量可以用新的 locale 進(jìn)行更新。
對于 iSeries 和 z/OS,請與您的系統管理員聯(lián)系。
本文沒(méi)有詳細討論應用程序代碼頁(yè)的設置,因為重點(diǎn)主要是在數據庫方面。然而,本文提到了一些可能十分有用的概念。
默認情況下,應用程序代碼頁(yè)派生于它所運行的操作系統。對于嵌入式 SQL 程序而言,應用程序代碼頁(yè)在預編譯/綁定時(shí)以及執行時(shí)確定。在預編譯和綁定時(shí),代碼頁(yè)派生于用于預編譯語(yǔ)句和 SQLCA 中返回的所有字符數據的數據庫連接。在執行時(shí),當建立數據庫連接時(shí),確定用戶(hù)應用程序代碼頁(yè),而且它只在連接期間有效。所有數據,包括動(dòng)態(tài) SQL 語(yǔ)句、用戶(hù)輸入數據、用戶(hù)輸出數據以及 SQLCA 中的字符字段,都是基于該代碼頁(yè)進(jìn)行解釋的。因此,如果程序包含常量字符串,您就應該使用相同的代碼頁(yè)預編譯、綁定、編譯和執行該應用程序。
對于 Unicode 數據庫,您應使用主機變量來(lái)代替字符串常量。該建議的理由就是服務(wù)器可能在綁定和執行階段都進(jìn)行數據轉換;如果程序中使用了常量字符串,這可能是一個(gè)憂(yōu)慮。在綁定時(shí),將基于在綁定期間有效的代碼頁(yè)轉換這些嵌入的字符串。7 位 ASCII 字符通用于 DB2 Universal Databas 所支持的所有代碼頁(yè),并且不會(huì )產(chǎn)生問(wèn)題。對于非 ASCII 字符,用戶(hù)應該確保具有相同活動(dòng)代碼頁(yè)的綁定和執行使用相同的轉換表。
對于 ODBC 或 CLI 應用程序,您或許可以在 odbc.ini 文件或 db2cli.ini 文件中使用不同的關(guān)鍵字來(lái)調整應用程序代碼頁(yè)。例如,Windows ODBC 應用程序可以使用關(guān)鍵字 TRANSLATEDLL 來(lái)表示 DB2TRANS.DLL 的位置,該文件包含代碼頁(yè)映射表,以及使用關(guān)鍵字 TRANSLATEOPTION 來(lái)定義數據庫的代碼頁(yè)數目。DISABLEUNICODE 關(guān)鍵字可以用于顯式地啟用或禁用 Unicode。默認情況下,沒(méi)有設置該關(guān)鍵字,這意味著(zhù)如果目標數據庫支持 Unicode,DB2 CLI 應用程序就將使用 Unicode 進(jìn)行連接。否則,DB2 CLI 應用程序將使用應用程序代碼頁(yè)進(jìn)行連接。當您顯式地設置 DISABLEUNICODE=0 時(shí),DB2 CLI 應用程序將總是用 Unicode 進(jìn)行連接,無(wú)論目標數據庫是否支持 Unicode。當 DISABLEUNICODE=1 時(shí),DB2 CLI 應用程序則總是用應用程序代碼頁(yè)進(jìn)行連接,無(wú)論目標數據庫是否支持 Unicode。
使用 Java Universal Type 4 驅動(dòng)程序的 Java 應用程序不需要在客戶(hù)端機器上安裝 DB2 UDB 客戶(hù)機。通用 JDBC 驅動(dòng)程序客戶(hù)端將數據作為 Unicode 發(fā)送給數據庫服務(wù)器,而數據庫服務(wù)器則將數據從 Unicode 轉換成所支持的代碼頁(yè)。從數據庫服務(wù)器發(fā)送給客戶(hù)端的字符數據是使用諸如 sun.io.* 轉換例程的 Java 的內置字符轉換器(converter)進(jìn)行轉換的。DB2 Universal JDBC Driver 支持的轉換限于底層 Java Runtime Environment(JRE)實(shí)現所支持的那些。對于 CLI 和遺留(legacy)JDBC 驅動(dòng)程序,要使用代碼頁(yè)轉換表。
z/OS 上運行的應用程序使用 DB2 UDB for z/OS 安裝面板上指定的應用程序編碼 CCSID 值。此外,應用程序編碼綁定(bind)選項也可以為程序中的主機變量定義 CCSID。對于動(dòng)態(tài) SQL 應用程序而言,就要使用 APPLICATION ENCODING 專(zhuān)用寄存器來(lái)覆蓋 CCSID。還可以通過(guò)在 DECLARE VARIABLE 語(yǔ)句中使用 CCSID 子句,在更細粒度的級別上指定 CCSID。(例如:EXEC SQL DECLARE :TEST VARIABLE CCSID UNICODE;)
本小節的討論與上面的闡述完全相同。
根據 DB2 UDB 平臺,按不同方式定義代碼頁(yè)。
數據庫可以只有一個(gè)代碼頁(yè),它是在您通過(guò) CREATE DATABASE 命令首次創(chuàng )建數據庫時(shí)使用 CODESET 和 TERRORITY 子句設置的。例如,下列命令創(chuàng )建了數據庫“spaindb”,使用代碼集 1252 和地域 ID 34,這確定了 Windows 平臺上用于西班牙語(yǔ)的代碼頁(yè)。(關(guān)于不同國家的代碼集和地域 ID 列表,請查閱支持的地域代碼和代碼頁(yè)。)
CREATE DATABASE spaindb USING CODESET 1252 TERRITORY es
創(chuàng )建數據庫之后,您就可以通過(guò)發(fā)出圖 6 中所示的命令 get db cfg for spaindb 查看該代碼頁(yè)的設置。
表 1 提供了圖 6 中每個(gè)字段的描述。
字段名稱(chēng)描述
Database territory確定一個(gè)國家的地域標識符。
Database code page指定用于創(chuàng )建該數據庫的代碼頁(yè)。
Database country/region code指定用于創(chuàng )建該數據庫的地域代碼。
Database collating sequence指定用于進(jìn)行字符數據排序的方法。
Alternate collating sequence指定在非 Unicode 數據庫中用于 Unicode 表的排序序列。在設置該參數以前,都無(wú)法在非 Unicode 數據庫中創(chuàng )建 Unicode 表和例程。
排序序列將在小節其他注意事項中進(jìn)行更詳細的討論。如果您使用默認值創(chuàng )建數據庫,那么所使用的代碼頁(yè)就來(lái)自于操作系統的信息。一旦用給定的代碼頁(yè)創(chuàng )建了數據庫,您就無(wú)法修改它,除非導出數據、刪除數據庫后,再用正確的代碼頁(yè)重新創(chuàng )建該數據庫并導入數據。
在 DB2 UDB for iSeries 上,數據庫中的每個(gè)物理文件或表都可以指定一個(gè)代碼頁(yè)。因此,一個(gè) iSeries 數據庫可以容納多個(gè)代碼頁(yè),甚至是 ASCII 代碼頁(yè),這取決于指定的代碼頁(yè)。
為了指定用于物理文件或表的代碼頁(yè),要使用下面兩種方法之一:
創(chuàng )建一個(gè)物理文件,并使用 CCSID 子句。例如,下列命令使用 Data Description Source(DDS)通過(guò) CCSID 62251 創(chuàng )建一個(gè)單成員(one-member)文件,并將其置于名為 DSTPRODLB 的庫中。
CRTPF FILE(DSTPRODLB/ORDHDRP) TEXT(‘Order header physical file‘) CCSID(62251)
這假定 DDS 源存在,并已經(jīng)正確定義。請注意,CCSID 值僅僅對于源物理文件 FILETYPE(*SRC) 有效。iSeries 表存儲在數據物理文件 FILETYPE(*DATA) 中,因此,您必須按那樣使用 DDS,并指定 CCSID。
使用帶有 CCSID 子句的 CREATE TABLE SQL 語(yǔ)句。例如,下列 SQL 語(yǔ)句創(chuàng )建了表 DEPARTMENT(并對兩列指定了 CCSID 37):
CREATE TABLE DEPARTMENT (DEPTNO CHAR(3) CCSID 37 NOT NULL, DEPTNAME VARCHAR(36) CCSID 37 NOT NULL, PRENDATE DATE DEFAULT NULL)
為了在作業(yè)級查看代碼頁(yè)的當前值,您可以從 OS/400 命令行鍵入下列命令:DSPJOB OPTION(*DFNA)。
如果您向下滾動(dòng)到第三頁(yè),就可以看到代碼頁(yè)設置,例如:
Language identifier . . . . . . . . . . . . . . . : ENU
Country or region identifier . . . . . . . . . . : CA
Coded character set identifier . . . . . . . . . : 37
Default coded character set identifier . . . . . : 37
如果未指定 CCSID,所使用的代碼頁(yè)就是下列三層之一所指定的:
分布式數據庫管理(Distributed Data Management,DDM)
作業(yè)(即在 OS 級)
用戶(hù)配置文件(即在系統級)
客戶(hù)機將在 DDM 請求(DDM 層)中發(fā)送其代碼頁(yè)。在 OS400 級上,CCSID 是按下列優(yōu)先級確定的:
使用字段定義中的 CCSID。
如果字段定義中沒(méi)有 CCISD,就使用文件級的 CCSID。
如果未指定文件級的 CCSID,就使用當前作業(yè)的 CCSID。
作業(yè)的 CCSID 是按下列方式確定的:
檢查用戶(hù)配置文件,并從中獲得 CCSID。
如果用戶(hù)配置文件未指定 CCSID,就通過(guò)系統值 QCCSID 確定該值。
在 DB2 UDB for z/OS 上,CCSID(代碼頁(yè))需要當安裝 DB2 UDB for z/OS 子系統時(shí)在面板 DSNTIPF 上指定。如圖 7 中所示。
DSNTIPF INSTALL DB2 - APPLICATION PROGRAMMING DEFAULTS PANEL 1 ===> _ Enter data below: 1 LANGUAGE DEFAULT ===> IBMCOB ASM,C,CPP,IBMCOB,FORTRAN,PLI 2 DECIMAL POINT IS ===> . . or , 3 STRING DELIMITER ===> DEFAULT DEFAULT, " or ‘ (COBOL or COB2 only) 4 SQL STRING DELIMITER ===> DEFAULT DEFAULT, " or ‘ 5 DIST SQL STR DELIMTR ===> ‘ ‘ or " 6 MIXED DATA ===> NO NO or YES for mixed DBCS data 7 EBCDIC CCSID ===> CCSID of SBCS or mixed data. 1-65533. 8 ASCII CCSID ===> CCSID of SBCS or mixed data. 1-65533. 9 UNICODE CCSID ===> 1208 CCSID of UNICODE UTF-8 data. 10 DEF ENCODING SCHEME ===> EBCDIC EBCDIC, ASCII, or UNICODE 11 APPLICATION ENCODING ===> EBCDIC EBCDIC, ASCII, UNICODE, cssid (1-65533) 12 LOCALE LC_CTYPE ===> PRESS: ENTER to continue RETURN to exit HELP for more information
表 2 提供了圖 7 中每個(gè)相關(guān)字段的描述。
字段名稱(chēng)描述
MIXED DATA指定 EBCDIC CCSID 和 ASCII CCSID 字段是否包含混合型數據。
EBCDIC CCSID指定 EBCDIC 編碼數據的默認 CCSID。
ASCII CCSID指定 ASCII 編碼字符數據的默認 CCSID。
UNICODE CCSID指定 Unicode 的默認 CCSID。DB2 UDB for z/OS 當前僅僅支持 CCSID 1208 用于 Unicode。
DEF ENCODING SCHEME指定在 DB2 中存儲數據的默認格式。
APPLICATION ENCODING指定影響 DB2 UDB for z/OS 如何解釋進(jìn)入 DB2 的數據的系統默認應用程序編碼模式。
LOCALE LC_CTYPE指定系統 LOCALE_LC_CTYPE。地區(locale)是系統環(huán)境中的一部分,取決于語(yǔ)言和文化習俗。LC_TYPE 是應用于字符函數的地區(locale)子集。例如,在美國指定 En_US 用于英語(yǔ),或在加拿大指定 Fr_CA 用于法語(yǔ)。
如果語(yǔ)言?xún)H僅使用單字節的 CCSID,那么 CCSID 中的混合型和雙字節 CCSID 就默認設置為預留的 CCSID 65534。由于諸如中文和日語(yǔ)等一些語(yǔ)言字符的復雜性和繁多,這些字符集就使用雙字節和混合型字符集。所有單字節和混合型 CCSID 都存儲在 DB2 UDB for z/OS 子系統參數作業(yè)中稱(chēng)作 DSNHDECP 的宏中。此外,DB2 UDB for z/OS 目錄表 SYSIBM.SYSSTRINGS 必須為所有必要的代碼頁(yè)轉換指出轉換表。
DB2 UDB for z/OS 使用 ASCII CCSID 值來(lái)執行從 ASCII 外部源(包括其他數據庫)收到的字符數據的轉換。您必須為 ASCII CCSID 字段指定一個(gè)值,即使您不必或不打算創(chuàng )建 ASCII 編碼的對象。
為了在表中存儲 ASCII 格式的數據,您可以在表、表空間或數據庫級上使用帶有 CCSID ASCII 子句的 CREATE 語(yǔ)句。例如,在表級別上,按下列方式使用 CREATE TABLE 語(yǔ)句:
CREATE TABLE T1 (C1 int CCSID ASCII, C2 char(10) CCSID ASCII)
來(lái)自于上面 CREATE TABLE 語(yǔ)句的 CCSID ASCII 值是從面板 DSNTIPF 中獲得的。
下列語(yǔ)句使用面板 DSNTIPF 中指定的默認編碼模式:
CREATE DATABASE
CREATE DISTINCT TYPE
CREATE FUNCTION
CREATE GLOBAL TEMPORARY TABLE
DECLARE GLOBAL TEMPORARY TABLE
CREATE TABLESPACE(在 DSNDB04 數據庫中)
如果 DSNTIPF 面板字段中的 CCSID 值不正確,字符轉換也將產(chǎn)生不正確的結果。正確的 CCSID 指定您站點(diǎn)的 I/O 設備、諸如 IMS 和 QMF 等本地應用程序以及諸如 CICS Transaction Server 等遠程應用程序所支持的編碼字符集。
若沒(méi)有 IBM DB2 UDB Technical Support 的特定指導,永遠不要修改現有 DB2 UDB for z/OS 系統的 CCSID;否則,您可能損壞數據!
前面的小節展示了在不同的平臺中如何可以為應用程序或數據庫確定和修改代碼頁(yè)值。本小節將通過(guò)兩個(gè)通用場(chǎng)景描述字符轉換過(guò)程。(它假定已經(jīng)為應用程序和數據庫確定了代碼頁(yè)值)。轉換過(guò)程的基本規則就是接收系統將總是執行代碼頁(yè)的轉換。
圖 8 中所展示的通用場(chǎng)景代表了下列情形:
Linux, UNIX, or Windows 客戶(hù)機上運行的應用程序到 DB2 UDB for Linux, UNIX, and Windows 服務(wù)器
iSeries 客戶(hù)機上運行的應用程序到 DB2 UDB for Linux, UNIX, and Windows 服務(wù)器
iSeries 客戶(hù)機上運行的應用程序到 DB2 UDB for iSeries 服務(wù)器
iSeries 客戶(hù)機上運行的應用程序到 DB2 UDB for z/OS 服務(wù)器
z/OS 客戶(hù)機上運行的應用程序到 DB2 UDB for Linux, UNIX, and Windows 服務(wù)器
z/OS 客戶(hù)機上運行的應用程序到 DB2 UDB for iSeries 服務(wù)器
z/OS 客戶(hù)機上運行的應用程序到 DB2 UDB for z/OS 服務(wù)器
圖 9 中所展示的通用場(chǎng)景代表了下列情形:
Linux, UNIX, or Windows 客戶(hù)機上運行的應用程序到 DB2 UDB for iSeries
Linux, UNIX, or Windows 客戶(hù)機上運行的應用程序到 DB2 UDB for z/OS
在圖 8 和 圖9 中,當應用程序所運行的操作系統是 Linux、UNIX 或 Windows 時(shí),就可能需要安裝 DB2 UDB for Linux, UNIX, and Windows 客戶(hù)機。如果應用程序是在 Java 中使用 JDBC Type 4 驅動(dòng)程序編寫(xiě)的,就不需要 DB2 UDB for Linux, UNIX, and Windows 客戶(hù)機。
在這兩個(gè)通用場(chǎng)景中,如果用于所有系統的代碼頁(yè)相同,就不會(huì )發(fā)生代碼頁(yè)轉換。當您處理訪(fǎng)問(wèn) DB2 UDB for iSeries 或 z/OS 數據(使用 EBCDIC 編碼模式)的 Linux、UNIX 或 Windows 應用程序(使用 ASCII 編碼模式)時(shí),這就不可能,除非所有這些系統都使用 Unicode。
下列例子說(shuō)明了字符轉換的過(guò)程。讓我們假定您具有下列配置:
一個(gè) ODBC 應用程序運行在 Windows 機器上,默認情況下,該應用程序使用操作系統的代碼頁(yè),本例子中就是 1252(Windows,English)。
將運行 DB2 Connect 的 AIX 服務(wù)器設置為使用 Unicode。
iSeries 服務(wù)器使用代碼頁(yè) 66535,并具有一個(gè)包含表 DEPARTMENT 的數據庫,表 DEPARTMENT 的定義如下:
CREATE TABLE DEPARTMENT (DEPTNO CHAR(3) NOT NULL, DEPTNAME VARCHAR(36) CCSID 37 NOT NULL, PRENDATE DATE DEFAULT NULL)
列 DEPTNO 和 PRENDATE 將使用 iSeries 代碼頁(yè) 66535 作為默認值。
當 Windows 應用程序發(fā)出諸如下面的請求時(shí):
SELECT DEPTNO FROM DEPARTMENT
將發(fā)生下列轉換:
Windows 通過(guò)代碼頁(yè) 1252 向 DB2 Connect 服務(wù)器發(fā)送請求。
DB2 Connect 服務(wù)器將之轉換成代碼頁(yè) 1208(Unicode),然后發(fā)送給 iSeries 服務(wù)器。
iSeries 服務(wù)器將之轉換成 CCSID 66535,并訪(fǎng)問(wèn) DEPARTMENT 表中的數據。
因為從表中獲得的數據是在 CCSID 66535 中,所以將在該代碼頁(yè)中,將數據發(fā)送給請求者(本例中,DB2 Connect 服務(wù)器)。
DB2 Connect 服務(wù)器將數據轉換成代碼頁(yè) 1208,然后發(fā)送給 Windows 應用程序。
Windows 操作系統將代碼頁(yè) 1208 轉回到 1252。
在代碼頁(yè)轉換期間,源代碼頁(yè) X 中的字符也許不存在于目標代碼頁(yè) Y 中。例如,讓我們假定一家跨國公司存儲了日語(yǔ)和德語(yǔ)這兩種語(yǔ)言的信息。一個(gè)相應的日語(yǔ)應用程序將數據插入這個(gè)使用 German 代碼頁(yè)創(chuàng )建的 DB2 UDB 數據庫中。在這樣的情形中,許多字符在 DB2 所使用的 CCSID 中沒(méi)有代碼點(diǎn)。這種情形下,解決該問(wèn)題的一種方法就是通過(guò)僅將源 CCSID 中的字符映射到目標 CCSID 中的相應字符。那些沒(méi)有映射的字符將通過(guò)預留的代碼點(diǎn)來(lái)代替。(每一個(gè)代碼頁(yè)至少預留了一個(gè)代碼點(diǎn),以便進(jìn)行替代。)那些無(wú)法映射到目標代碼頁(yè)的字符將永遠丟失。該方法稱(chēng)作強制子集轉換。
另一種轉換方法稱(chēng)作往返轉換。兩個(gè) CCSID 之間的往返轉換確保所有進(jìn)行“往返”的字符都以初始的樣子到達,即使接收 CCSID 不支持某一給定字符。往返轉換確保從 CCSID X 轉換成 CCSID Y,并返回為 CCSID X 的代碼點(diǎn)的過(guò)程得到保護,即使 CCSID Y 無(wú)法完全表示這些代碼點(diǎn)。這是通過(guò)使用轉換表實(shí)現的。
當您需要使用轉換表的不同版本時(shí),如 Microsoft 版本,就必須手工替換默認的轉換表(.cnv)文件,該文件駐留在 UNIX 和 Linux 平臺的 .../sqllib/conv 目錄或 Windows 上的 ...\sqllib\conv 中。這些表是用于在不同代碼頁(yè)之間轉換值的外部代碼頁(yè)轉換表。在替換 sqllib/conv 目錄中現有的代碼頁(yè)轉換表之前,您應該備份該文件。
在所有平臺上,DB2 UDB 都支持 International Standards Organization(ISO)/International Electrotechnical Commission(IEC)標準 10646(ISO/IEC 標準 10646)Universal 2-Octect Coded Character Set(UCS-2)。UCS-2 是用 Unicode Transformation Format 8 位編碼格式(UTF-8)實(shí)現的。UTF-8 是為了易于使用現有基于 ASCII 的系統而設計的。UTF-8 格式中數據的代碼頁(yè)/CCSID 值是 1208。用于 UCS-2 的 CCSID 值是 1200。UTF-8 被選擇為字符數據列的默認格式,其中 UTF-16 用于圖形數據列。
使用默認值創(chuàng )建的 DB2 UDB for Linux, UNIX, and Windows 數據庫將在 ASCII 中創(chuàng )建表。為了創(chuàng )建 Unicode 數據庫,要使用帶有 CODESET 和 TERRITORY 子句的 CREATE DATABASE,如下:
CREATE DATABASE unidb USING CODESET UTF-8 TERRITORY US
這個(gè) Unicode 數據庫中的表都將默認為代碼頁(yè) 1208。您無(wú)法在 Unicode 數據庫中用 ASCII 代碼頁(yè)定義表。然而,反過(guò)來(lái)則可以;即您可以在非 Unicode 的數據庫中創(chuàng )建 Unicode 表。這可以通過(guò)調用使用了 CCSID UNICODE 子句的 CREATE TABLE 語(yǔ)句來(lái)執行。例如:
CREATE TABLE unitbl (col1 char(10), col3 int) CSSID UNICODE
為了使之工作,您首先需要激活數據庫配置參數 alt_collate。一旦設置好了,該參數就無(wú)法進(jìn)行修改或重新設置。
UPDATE DB CFG FOR nonunidb USING ALT_COLLATE IDENTITY_16BIT
在 DB2 UDB for iSeries 中,CCSID 子句可以用于單獨的列上。例如,下列 SQL 語(yǔ)句創(chuàng )建表 U_TABLE。U_TABLE 包含一個(gè)名為 EMPNO 的字符列,以及兩個(gè) Unicode 圖形列。NAME 是一個(gè)固定長(cháng)度的 Unicode 圖形列,而 DESCRIPTION 是一個(gè)可變長(cháng)度的 Unicode 圖形列。EMPNO 字段僅僅包含數字,且不需要 Unicode 支持。NAME 和 DESCRIPTION 字段則都是 Unicode 字段。這兩個(gè)字段可能包含不止一個(gè) EBCDIC 代碼頁(yè)中的數據。
CREATE TABLE U_TABLE (EMPNO CHAR(6) NOT NULL, NAME GRAPHIC(30) CCSID 1200, DESCRIPTION VARGRAPHIC(500) CCSID 1200)
關(guān)于 iSeries 中有效的 CCSID 值列表,請查閱Supported CCSID mappings。
與 DB2 UDB for Linux, UNIX, and Windows 相似,在 DB2 UDB for z/OS 中,如果您在對象定義上使用了 CCSID UNICODE 子句,就可以存儲并檢索 Unicode 數據,例如:
CREATE TABLE DBTBDWR.WBMTEBCD (CUSTNO CHAR(8), CUSTBU CHAR(6), CUSTEXT CHAR(3), CNAME VARCHAR(80) FOR MIXED DATA) IN TEST.CUSTTS CCSID UNICODE
DB2 UDB for z/OS 使用 LE(語(yǔ)言環(huán)境)的 ICONV 執行字符轉換,除非安裝了 z/OS Unicode Conversion Services。為了了解如何設置用于 DB2 的 z/OS Unicode Conversion Services,請查看信息 APAR II13048 和 II13049。為了查看是否安裝了轉換,請通過(guò)控制臺使用命令 /d uni, all,如圖 10 中所示。
例如,圖 10 展示了有從 1252 到 1208 以及 1208 到 1252(即從 Windows English 到 Unicode 以及反向進(jìn)行)的轉換。
在所有系統之間使用 Unicode 編碼模式將避免進(jìn)行字符轉換,并提高性能。
排序序列是字符集的一種次序,確定每個(gè)字符與另一字符相比排列更高、更低或相同。排序序列將代碼點(diǎn)映射至每個(gè)字符在已排序序列中的期望位置。例如,ASCII 中的排序序列是:空格、數字值、大小字符、小寫(xiě)字符。另一方面,EBCDIC 中的排序序列則是:空格、小寫(xiě)字符、大寫(xiě)字符和數字值。
如果在 EBCDIC 數據庫上使用設計于操作 ASCII 數據庫的應用程序,就可能產(chǎn)生問(wèn)題,因為其排序序列不同。您可以創(chuàng )建定制的排序序列。關(guān)于更多細節,請查閱 Application Development Guide: Programming Client Applications 手冊(參見(jiàn)參考資料)。
聯(lián)邦系統不支持某些數據映射。例如,DB2 UDB 聯(lián)邦服務(wù)器不支持數據類(lèi)型 LONG VARCHAR 的映射。因此,所討論的場(chǎng)景可能不起作用。關(guān)于更多細節,請查看 Federated Systems Guide(參見(jiàn)參考資料)。
您無(wú)法用給定的代碼頁(yè)備份數據庫,并用不同的代碼頁(yè)將之恢復為另一種。在 DB2 UDB for Linux, UNIX, and Windows 上,您應使用 export 或 db2move 實(shí)用程序,用新要求的代碼頁(yè)創(chuàng )建新的數據庫,并對數據進(jìn)行 import 或反向 db2move。在使用該方法時(shí),DB2 UDB 將正確地執行字符轉換。
通過(guò) BLOB 數據類(lèi)型或使用 FOR BIT DATA 子句定義的列將以二進(jìn)制形式從源傳遞到目標,所使用的代碼頁(yè)是零。這表示不會(huì )發(fā)生任何代碼頁(yè)轉換。
當您碰到字符轉換方面的問(wèn)題時(shí),首先要識別應用程序和所涉及的 DB2 UDB 數據庫服務(wù)器使用哪些代碼頁(yè)。
除了前面所討論的用于確定操作系統或 DB2 UDB 數據庫服務(wù)器的代碼頁(yè)值的方法之外,下列方法將向您展示目標和源中的代碼頁(yè)。本小節中的討論適用于 DB2 UDB for Linux, UNIX, and Windows。
使用帶有“-a”選項的 CLP 來(lái)顯示 SQLCA 信息
當您使用 CLP 的“-a”選項來(lái)顯示 SQLCA 信息時(shí),將展示源應用程序(本例中,CLP)和目標數據庫的代碼頁(yè)。圖 11 展示了一個(gè)從 Windows 上 CLP 連接到 Windows 上數據庫的例子。
在圖 11 中,請注意下行:
sqlerrmc: 1 1252 ARFCHONG SAMPLE QDB2/NT 557 557 0 1252 1
第一個(gè)實(shí)例“1252”指明目標上所使用的代碼頁(yè),即 Windows US-English。第二個(gè)實(shí)例指明源上所使用的代碼頁(yè),同樣也是 Windows US-English。
圖 12 展示了另一例子,這次是從 Windows CLP(其中安裝了 DB2 Connect)連接到 DB2 UDB for z/OS 目標數據庫。
在圖 12,請注意下行:
sqlerrmc: 1208 TS56692 HOSTV8 QDB2 1252
1208 指明目標 DB2 UDB for z/OS 子系統使用 Unicode。
1252 指明源 CLP 應用程序使用 Windows US-English。
為 CLI、ODBC 或 JDBC Type 2 應用程序使用 CLI 跟蹤
為了標識 CLI 和 JDBC type 2 應用程序的代碼頁(yè),您可以使用 DB2 CLI on Linux, UNIX, and Windows 所提供的跟蹤工具。默認情況下,該跟蹤工具是禁用的,并且不使用任何附加的計算資源。啟用時(shí),無(wú)論應用程序何時(shí)訪(fǎng)問(wèn) CLI 驅動(dòng)程序,都將生成文本日志文件。您可以通過(guò)在 db2cli.ini 文件中添加下列 DB2 CLI 關(guān)鍵字來(lái)打開(kāi) CLI 跟蹤,如下:
[COMMON] trace=1 TraceFileName=\temp\clitrace.txt TraceFlush=1
\temp\clitrace.txt 可以是任意的名稱(chēng),用來(lái)做為跟蹤存儲的目錄和文件名。
您可以在跟蹤輸出文件中從 SQLConnect() 或 SQLDriverConnectW() 調用找到應用程序和數據庫代碼頁(yè)。例如,應用程序和數據庫服務(wù)器在下列消息中使用相同的代碼頁(yè)(1252):
(Application Codepage=1252, Database Codepage=1252, Char Send/Recv Codepage=1252, GraphicSend/Recv Codepage=1200, Application CharCodepage=1252, Application Graphic Codepage=1200
在大多數情況下,沒(méi)有定義源和目標代碼頁(yè)之間的轉換表或定義。DB2 UDB for Linux, UNIX, and Windows 中的轉換表存儲在 sqllib/conv 目錄下,它們通常處理大多數轉換場(chǎng)景。
在 iSeries 上,IBM 提供的表可以在 QUSRSYS 庫中找到。您還可以使用 Create Table(CRTTBL)命令創(chuàng )建自己的轉換表。iSeries Information Center 中的 Globalization 主題包括了轉換表列表(參見(jiàn)參考資料)。
您還可以運行下列查詢(xún)來(lái)查看字符集名稱(chēng)列表:
SELECT character_set_name from sysibm.syscharsets
在 DB2 UDB for z/OS 上,如圖 10 中所示,您可能需要發(fā)出 /d uni, all 命令來(lái)顯示已經(jīng)安裝了的轉換。如果該命令的輸出沒(méi)有列出您所需要的轉換,例如從 1252 到 1208,您就要向 Unicode Conversion Services 添加一個(gè)轉換條目(示例 JCL hlq.SCUNJCL(CUNJIUTL)),例如:CONVERSION 1252,1208,ER
您還要在 DB2 UDB for z/OS 目錄表 SYSIBM.SYSTRINGS 中驗證存在給定的轉換條目。例如,查看該表中的條目列表,就要發(fā)出該查詢(xún):
SELECT inccsid, outccsid FROM sysibm.sysstrings
如果這些還沒(méi)有解決您的問(wèn)題,請聯(lián)系 DB2 UDB Technical Support。您可能被要求收集 DB2 跟蹤,并用 fmt -c 選項(以前稱(chēng)作 DDCS 跟蹤)將其格式化。該跟蹤將展示源和目標之間傳遞和檢索了什么。
本文提供了對于 DB2 UDB 數據庫內部以及數據庫之間發(fā)生的字符轉換過(guò)程的概述。它首先解釋了諸如代碼頁(yè)、代碼點(diǎn)和編碼模式等關(guān)鍵概念,并說(shuō)明了如何查看它們的當前值以及如何更新該值。接著(zhù),提供了通用場(chǎng)景以展示字符轉換的過(guò)程。本文闡述了轉換期間的一些特殊注意事項,并提供了一個(gè)兩步確定導致轉換問(wèn)題原因的方法。
理想情況下,您應通過(guò)在轉換的源和目標之間使用相同的代碼頁(yè),盡力避免字符轉換以提高性能。但是如果您的數據庫場(chǎng)景十分復雜,您無(wú)法避免字符轉換,那么本文的知識將幫助您盡可能順利地完成該過(guò)程。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
WIDOWS核心資料(全)
U n i c o d e與Windows編程(1) | 夢(mèng)之城堡
Microsoft Windows CE 編程的十點(diǎn)忠告
關(guān)于unicode,mbcs,utf8,charset,encoding等相關(guān)概念的說(shuō)明
DB2 UDB命令行處理器介紹(1)
揭密JDBC驅動(dòng)程序
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久