首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

IBM InfoSphere Federation Server V9.7 對 VARCHAR2 資料型態與語意的支援詳解

     編輯:DB2 教學

前言

DB2 9.5 引入 VARCHAR2 相容特性,降低 Oracle 遷移難度。Federation Server 9.7 作為 DB2 延伸,同步支援 VARCHAR2 型態與 Oracle 字串語意(空字串視為 NULL、非空白填補比較等)。本文詳細說明四種聯邦/遠端資料源語意組合下的字串比較、空值處理、純量函數下推行為,並附實測案例。

VARCHAR2 型態與語意定義

  • 空字串儲存為 NULL(標準 SQL 允許空字串)。
  • 變長字串比較採用 non blank-padding 演算法(標準採 blank-padding)。
  • 常數字串 ≤255 位元組儲存為 CHAR,>254 位元組儲存為 VARCHAR2,最大 32672 位元組。
  • 純量函數回傳長度 0 字串時轉為 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。

Federation Server 兩種模式

  • 預設模式:不支援 VARCHAR2 語意。
  • VARCHAR2 相容模式:建立聯邦資料庫前設 DB2_COMPATIBILITY_VECTOR=0x20。此模式下 VARCHAR2 與 VARCHAR 同義,型錄中儲存為 VARCHAR。

兩個新 Server Options

選項說明預設值
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');

三大字串操作行為分析

1. VARCHAR 字串比較(基本謂詞、GROUP BY、ORDER BY、排序)

配置比較演算法下推行為備註
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 '

  • Oracle 客戶端 name='Jim ' 只回傳 'Jim '
  • 配置 b) 聯邦庫補償下推 RPAD(name,10,' ')=RPAD('Jim ',10,' ') 回傳兩筆
  • 配置 d) 直接下推 non blank-padding 只回傳 'Jim '
  • Informix 客戶端 blank-padding 回傳兩筆
  • 配置 a) 下推回傳兩筆
  • 配置 c) 本地 non blank-padding 只回傳 'Jim '

結論:配置 a) 模擬 Informix 行為,配置 d) 模擬 Oracle 行為。

2. 空字串與 NULL 處理

配置處理邏輯下推
a雙方允許空字串下推
b聯邦允許,遠端視為 NULL;插入非空欄位報錯下推(遠端轉換)
c聯邦視為 NULL,遠端允許空字串;僅保證一致性時下推有條件下推
d雙方視為 NULL下推

CHAR 欄位特殊規則:單列 INSERT/UPDATE 時,聯邦庫直接將空字串映射為 NULL(不 blank-pad);多列 INSERT 時依 DB2 語意 blank-pad 後傳送。

3. 純量字串函數(UPPER, LOWER, LENGTH, TRIM, SUBSTR, CONCAT, INSERT, REPLACE 等)

配置下推行為語意差異
a下推雙方標準語意
b不下推聯邦標準,遠端 VARCHAR2 語意(如 CONCAT('Mr',NULL) 遠端回 'Mr',聯邦回 NULL)
c不下推聯邦 VARCHAR2,遠端標準
d下推雙方 VARCHAR2 語意一致

實測:遠端表 manager(manager varchar(10)) 有空字串與 NULL 兩列。

  • Oracle 客戶端:UPPER(manager) 皆回 NULL;SUBSTR(dept,1,0) 回 NULL;CONCAT('Mr',manager) 回 'Mr'。
  • 配置 b) 本地執行:UPPER 同 Oracle;SUBSTR 回空字串(非 NULL);CONCAT 回 NULL。
  • 配置 d) 下推:結果與 Oracle 客戶端完全一致。
  • Informix 客戶端:UPPER 空字串回空字串;SUBSTR 回空字串;CONCAT 空字串回 'Mr',NULL 回 NULL。
  • 配置 a) 下推:結果與 Informix 一致。
  • 配置 c) 本地執行:UPPER 同 Oracle;SUBSTR 回 NULL;CONCAT 回 'Mr'。

結語

Federation Server 9.7 透過 VARCHAR2_COMPAT 與 NO_EMPTY_STRING 選項,精細控制四種語意組合下的下推與轉換行為。關鍵原則:語意一致則下推,語意衝突則本地執行(配置 b/c)或補償下推(配置 b 比較)。配置 d) 能完美模擬 Oracle 客戶端行為,配置 a) 模擬標準 SQL/Informix 行為。遷移與異構整合專案中,正確設定這兩個選項至關重要,直接影響查詢正確性與效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved