DB2 9.5 引入 VARCHAR2 相容特性,降低 Oracle 遷移難度。Federation Server 9.7 作為 DB2 延伸,同步支援 VARCHAR2 型態與 Oracle 字串語意(空字串視為 NULL、非空白填補比較等)。本文詳細說明四種聯邦/遠端資料源語意組合下的字串比較、空值處理、純量函數下推行為,並附實測案例。
啟用方式:建庫前設登錄變數 DB2_COMPATIBILITY_VECTOR=0x20(預設 0)。
db2set DB2_COMPATIBILITY_VECTOR=20
db2 terminate; db2stop; db2start
db2 create db SAMPLE1 -- 支援 VARCHAR2 語意
db2set DB2_COMPATIBILITY_VECTOR=
db2 terminate; db2stop; db2start
db2 create db SAMPLE2 -- 不支援
驗證:db2 get db cfg 中 Varchar2 compatibility = ON/OFF。
DB2_COMPATIBILITY_VECTOR=0x20。此模式下 VARCHAR2 與 VARCHAR 同義,型錄中儲存為 VARCHAR。| 選項 | 說明 | 預設值 |
|---|---|---|
VARCHAR2_COMPAT | 遠端資料源是否支援 VARCHAR2 語意。Oracle 預設 Y,其他 N。相容 VARCHAR2 的 DB2 LUW 需手動設 Y。 | Oracle: Y;其他: N |
NO_EMPTY_STRING | 遠端資料源/欄位是否不存在空字串。聯邦庫支援 VARCHAR2 而遠端不支援時,設 Y 可避免空字串→NULL 轉換,提升效能。同時也是 Column Option。 | N |
依遠端資料源與聯邦資料庫是否支援 VARCHAR2 語意:
| 配置 | 聯邦資料庫 | 遠端資料源 | 典型範例 |
|---|---|---|---|
| a | 不支援 | 不支援 | DB2→DB2/Informix/MS SQL |
| b | 不支援 | 支援 | DB2→Oracle/相容VARCHAR2的DB2 |
| c | 支援 | 不支援 | VARCHAR2聯邦庫→Informix/MS SQL |
| d | 支援 | 支援 | VARCHAR2聯邦庫→Oracle/相容VARCHAR2的DB2 |

c) 聯邦庫支援、遠端不支援:
CREATE SERVER S TYPE DB2/CS VERSION 9.7 WRAPPER W AUTHORIZATION "authid" PASSWORD "pwd"
OPTIONS (DBNAME 'DBNAME', VARCHAR2_COMPAT 'N', NO_EMPTY_STRING 'Y');
d) 雙方皆支援:
CREATE SERVER S TYPE ORACLE VERSION 11.0 WRAPPER W AUTHORIZATION "authid" PASSWORD "pwd"
OPTIONS (VARCHAR2_COMPAT 'Y', NODE 'ora11g', PASSWORD 'Y');
| 配置 | 比較演算法 | 下推行為 | 備註 |
|---|---|---|---|
| a | 雙方 blank-padding | 下推 | 行為一致 |
| b | 聯邦 blank-padding,遠端 non blank-padding | 基本謂詞/IN 補償下推(RPAD) | 聯邦庫補齊空白使結果一致 |
| c | 聯邦 non blank-padding,遠端 blank-padding | 不下推 | 語意衝突,本地執行 |
| d | 雙方 non blank-padding | 下推 | 行為一致 |
範例:遠端表 emp(name varchar(10)) 有 'Jim' 與 'Jim '
name='Jim ' 只回傳 'Jim 'RPAD(name,10,' ')=RPAD('Jim ',10,' ') 回傳兩筆結論:配置 a) 模擬 Informix 行為,配置 d) 模擬 Oracle 行為。
| 配置 | 處理邏輯 | 下推 |
|---|---|---|
| a | 雙方允許空字串 | 下推 |
| b | 聯邦允許,遠端視為 NULL;插入非空欄位報錯 | 下推(遠端轉換) |
| c | 聯邦視為 NULL,遠端允許空字串;僅保證一致性時下推 | 有條件下推 |
| d | 雙方視為 NULL | 下推 |
CHAR 欄位特殊規則:單列 INSERT/UPDATE 時,聯邦庫直接將空字串映射為 NULL(不 blank-pad);多列 INSERT 時依 DB2 語意 blank-pad 後傳送。
| 配置 | 下推行為 | 語意差異 |
|---|---|---|
| a | 下推 | 雙方標準語意 |
| b | 不下推 | 聯邦標準,遠端 VARCHAR2 語意(如 CONCAT('Mr',NULL) 遠端回 'Mr',聯邦回 NULL) |
| c | 不下推 | 聯邦 VARCHAR2,遠端標準 |
| d | 下推 | 雙方 VARCHAR2 語意一致 |
實測:遠端表 manager(manager varchar(10)) 有空字串與 NULL 兩列。
UPPER(manager) 皆回 NULL;SUBSTR(dept,1,0) 回 NULL;CONCAT('Mr',manager) 回 'Mr'。UPPER 同 Oracle;SUBSTR 回空字串(非 NULL);CONCAT 回 NULL。UPPER 空字串回空字串;SUBSTR 回空字串;CONCAT 空字串回 'Mr',NULL 回 NULL。UPPER 同 Oracle;SUBSTR 回 NULL;CONCAT 回 'Mr'。Federation Server 9.7 透過 VARCHAR2_COMPAT 與 NO_EMPTY_STRING 選項,精細控制四種語意組合下的下推與轉換行為。關鍵原則:語意一致則下推,語意衝突則本地執行(配置 b/c)或補償下推(配置 b 比較)。配置 d) 能完美模擬 Oracle 客戶端行為,配置 a) 模擬標準 SQL/Informix 行為。遷移與異構整合專案中,正確設定這兩個選項至關重要,直接影響查詢正確性與效能。