2009年3月8日 星期日

DB2中系統自動產生的table (Explain_、TYYYYMMDDYY_xxxxxx、TYYYYMMDDYY_xxxxxx_exception)

在使用DB2時,會發現有些table明明不是我們自己建的table莫名其妙的跑了出來。
這些table通常都是以Explain_為開頭,或table名稱格式為TYYYYMMDDYY_xxxxxx、TYYYYMMDDYY_xxxxxx_exception,這些table的功用為:
  1. Explain:
    DB2中 EXPLAIN_開頭的table為DB2執行計畫工具所產的表格,主要存放SQL 執行計畫(Execute Plan)。
    通常在DB2 Client工具第一次用到 執行計劃 功能 會自動建立,如下圖。或由DBA透過執行(DB2安裝目錄)/sqllib/misc/EXPLAIN.DDL腳本產生。

    關於這組table的詳細資訊可參考:
    http://publib.boulder.ibm.com/infocenter/db2luw/v9/topic/com.ibm.db2.udb.admin.doc/doc/r0008441.htm

  2. table名稱格式為TYYYYMMDDYY_xxxxxx、TYYYYMMDDYY_xxxxxx_exception:
    執行 DB2 Load公用程式 或 DB2控制中心 工具做匯入資料時,若有違反 table Constraint無法寫入資料時,會將暫存資料和無法寫入的資料放在這兩個table中。

2008年7月11日 星期五

DB2中文問題

哀阿...
昨天才從同事口中得知中文varchar在DB2 UTF-8資料庫中一個中文字有三個bytes怎會如此咧??

OK......
先看看下面:


-- DB
-- codePage =1208 (=x04B8) Unicode - UTF-8
-- codeSet = UTF-8
-- TERRITORY = TW
CREATE DATABASE TESTDB ON c: USING CODESET UTF-8 TERRITORY TW COLLATE USING IDENTITY ;

create table test (field1 varchar(10)); --10 byte
insert into test values('1234567890'); --ok
insert into test values('一二三四五六七八九零'); --err , too long
insert into test values(N'一二三四五六七八九零'); --err, too long
select length('一二三四五六七八九零'),length(N'一二三四五六七八九零') from test --30,10

create table test2 (field2 vargraphic(10) ); --30 byte
insert into test2 values('1234567890'); --ok
insert into test2 values('一二三四五六七890'); --ok
select length('一二三四五六七八九零'),length(N'一二三四五六七八九零') from test2; --30,10
select length(field2) from test2;

select field2,length(field2) AS LEN from test2 --不論中英文,每個字元在string function中長度都是1
select field2,Substr(field2,1,2) from test2 --Graphic也可以用於字串函數

-- 所以varGraphic= MSSQL的nvarchar
-- N'xxxStr' 代表 varGraphic型態


所以說在開table時下的ddl應該使用Graphic和varGraphic型態,
在使用起來會比較順...

至於char和graphic差在哪... 會不會有效能上的考量....

找到資料後再說......


===================================================================
另外幾個與DB2中文處理的相關文章: