2008年9月25日 星期四

Federated UTF-8 and BIG5 databases using DB2 9


/*
  DATABASES:
        ORIONDB (codeset UTF-8)
        BIG5DB (codeset BIG5)
  TABLES:
        ORIONDB.UTF8_TAB
        BIG5DB.BIG5_TAB
  Create nickname UTF8_TAB on Database BIG5DB for ORIONDB.UTF8_TAB
  Create nickname BIG5_TAB on Database ORIONDB for BIG5DB.BIG5_TAB
  Insert multi-byte characters respectively
*/

/* check codeset on ORIONDB */

C:\>db2 get db cfg for oriondb

    資料庫 oriondb 的資料庫配置

 資料庫配置版次              = 0x0c00
 資料庫版次                = 0x0c00

 資料庫專屬區               = TW
 資料庫字碼頁               = 1208
 資料庫字碼集               = UTF-8
 資料庫國碼/地區碼            = 88
 資料庫對照順序              = IDENTITY
 ‧
 ‧
 ‧

/* Create Database BIG5DB */

create database big5db on 'c:\' using codeset BIG5 TERRITORY TW COLLATE using SYSTEM

C:\>db2 get db cfg for big5db

    資料庫 big5db 的資料庫配置

 資料庫配置版次              = 0x0c00
 資料庫版次                = 0x0c00

 資料庫專屬區               = TW
 資料庫字碼頁               = 950
 資料庫字碼集               = big5
 資料庫國碼/地區碼            = 88
 資料庫對照順序              = UNIQUE
 ‧
 ‧
 ‧

/* Connect to BIG5DB */

C:\>db2 connect to big5db

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.5.0
 SQL 授權 ID      = ORION
 本地資料庫別名     = BIG5DB

/* Create Table BIG5_TAB on BIG5DB */

CREATE TABLE BIG5_TAB
(
  COL1 VARCHAR(10)
) IN USERSPACE1

INSERT INTO BIG5_TAB VALUES ('BIG-5')


/*
  Create Wrapper and Server on database BIG5DB for database ORIONDB
  to create nickname later.
  Server name: BIG5DB
*/

/* Connect to ORIONDB */

C:\>db2 connect to oriondb

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.5.0
 SQL 授權 ID      = ORION
 本地資料庫別名     = ORIONDB

/* Create Table UTF8_TAB on ORIONDB */

CREATE TABLE UTF8_TAB
(
  COL1 VARCHAR(12)
) IN USERSPACE1

INSERT INTO UTF8_TAB VALUES ('UTF8')

/* Create Nickname BIG5_TAB on ORIONDB */

C:\>db2 create nickname orion.big5_tab for big5db.orion.big5_tab
DB20000I SQL 指令已順利完成。


/*
  Back to BIG5DB
  Create Nickname UTF8_TAB on BIG5DB
*/


C:\>db2 connect to big5db

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.5.0
 SQL 授權 ID      = ORION
 本地資料庫別名     = BIG5DB

C:\>db2 create nickname orion.utf8_tab for oriondb.orion.utf8_tab
DB20000I SQL 指令已順利完成。

C:\>db2 select * from utf8_tab

COL1
------------
UTF8

  已選取 1 個記錄。

/* Check Nickname Layout */

C:\>db2 describe table utf8_tab

直欄名稱 綱目   資料類型名稱  長度  比例 Null
------- --------- ------------ ------ ---- ------
COL1  SYSIBM   VARCHAR     12   0  是

  已選取 1 個記錄。

/* Check Data using HEX */

C:\>db2 select hex(col1) from utf8_tab fetch first 1 row only

1
------------------------
EFBCB5EFBCB4EFBCA6EFBC98

  已選取 1 個記錄。

/* Check HEX Data which Database BIG5DB use exactly */

C:\>db2 select hex('一') from sysibm.sysdummy1

1
----
A440

  已選取 1 個記錄。

/* It would be failed as inserting more than four multi-byte characters */

C:\>db2 insert into utf8_tab values ('一二三四五')
DB21034E 指令被當作 SQL 陳述式處理,因為他不是有效的「指令行處理器」指令。 在SQL 處理程序期間,他已傳回:
SQL1822N 從資料來源 "ORIONDB" 接收到的非預期錯誤碼"22001"。相關的文字及記號為 "func="SQLExecute" msg=" SQL0433N 值 "一二三四五"太長。"。 SQLSTATE=560BD

C:\>db2 insert into utf8_tab values ('一二三四')
DB20000I SQL 指令已順利完成。

/* Back to Database ORIONDB */

C:\>db2 connect to oriondb

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.5.0
 SQL 授權 ID      = ORION
 本地資料庫別名     = ORIONDB


/*
  two multi-byte characters are failed to select
  real value is 'BIG-5'
*/


C:\>db2 select * from big5_tab

COL1
----------
BIG

  已選取 1 個記錄。

/* Check Nickname Layout */

C:\>db2 describe table big5_tab

直欄名稱 綱目   資料類型名稱  長度  比例 Null
------- --------- ------------ ------ ---- ------
COL1  SYSIBM   VARCHAR     10   0  是

  已選取 1 個記錄。

/* You can insert precise length data, but fail to select completely */

C:\>db2 insert into big5_tab values ('一二三四五')
DB20000I SQL 指令已順利完成。

C:\>db2 select * from big5_tab

COL1
----------
BIG
一二三

  已選取 2 個記錄。

/* Check hex data from big5_tab */

C:\>db2 select hex(col1) from big5_tab fetch first 1 row only

1
------------------------------
A2D0A2D7A2D5A1D0A2B4

已選取 1 個記錄。

/* Check HEX Data which Database ORIONDB use exactly */

C:\>db2 select hex('一') from sysibm.sysdummy1

1
------
E4B880

已選取 1 個記錄。


/*
  Alter nickname big5_tab (length / 2 * 3)
  to show whole data
*/


C:\>db2 alter nickname orion.big5_tab alter column col1 local type varchar(15)
DB20000I SQL 指令已順利完成。

C:\>db2 select * from big5_tab

COL1
---------------
BIG-5
一二三四五

  已選取 2 個記錄。


/*
  after delete record where col1 = '一二三四五'
  I found something really odd:
  select with fetch or not will have very different result on hex
*/


C:\>db2 select hex(col1) from big5_tab

1
--------------------
EFBCA2EFBCA9EFBCA720

  已選取 1 個記錄。

C:\>db2 select hex(col1) from big5_tab fetch first 1 row only

1
--------------------
A2D0A2D7A2D5A1D0A2B4

  已選取 1 個記錄。

/* And it happened on Multi-Byte Characters */


/*
  Back to BIG5DB
  Create Nickname UTF8_TAB2 on BIG5DB
*/


C:\>db2 connect to big5db

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.5.0
 SQL 授權 ID      = ORION
 本地資料庫別名     = BIG5DB

C:\>db2 create table big5_tab2 ( col1 integer,col2 varchar(10) ) in userspace1
DB20000I SQL 指令已順利完成。

/* insert testing data */
inesrt into big5_tab2 values (1,'odd'),(2,'ODD')

/* Connect ORIONDB again */

C:\>db2 connect to oriondb

  資料庫連線資訊

 資料庫伺服器      = DB2/NT 9.5.0
 SQL 授權 ID      = ORION
 本地資料庫別名     = ORIONDB

C:\>db2 create nickname orion.big5_tab2 for big5db.orion.big5_tab2
DB20000I SQL 指令已順利完成。

C:\>db2 select col1,col2,hex(col2) from big5_tab2 fetch first 2 row only

COL1 COL2  3
----- ------ --------------------
  1 odd  6F6464
  2 ODD A2DDA2D2A2D2

  已選取 2 個記錄。

C:\>db2 select col1,col2,hex(col2) from big5_tab2

COL1 COL2  3
---- ------ --------------------
  1 odd  6F6464
  2 ODD EFBCAFEFBCA4EFBCA4

  已選取 2 個記錄。