6.3. Debezium Oracle コネクターによるデータ型のマッピング方法

テーブル行で発生する変更を表すために、Debezium Oracle コネクターは、行が存在するテーブルのように構造化された変更イベントを出力します。イベントには、各列の値のフィールドが含まれます。列の値は、この列の Oracle のデータ型に従って表示されます。以下のセクションでは、Oracle データ型をイベントフィールドの リテラル型 および セマンティック型にマッピングする方法を説明します。

リテラル型
Kafka Connect スキーマ型を使用して、値をリテラルで表す方法を記述します。INT8INT16INT32INT64FLOAT32FLOAT64BOOLEANSTRINGBYTESARRAYMAP、および STRUCT
セマンティック型
フィールドの Kafka Connect スキーマの名前を使用して、Kafka Connect スキーマがフィールドの 意味 をキャプチャーする方法を記述します。

詳細は以下を参照してください。

文字タイプ

以下の表は、コネクターによる基本の文字タイプへのマッピング方法を説明しています。

表6.5 Oracle 基本文字型のマッピング

Oracle データ型リテラル型 (スキーマ型)セマンティック型 (スキーマ名) および注記

CHAR[(M)]

STRING

該当なし

NCHAR[(M)]

STRING

該当なし

NVARCHAR2[(M)]

STRING

該当なし

VARCHAR[(M)]

STRING

該当なし

VARCHAR2[(M)]

STRING

該当なし

バイナリーおよび文字の LOB 型

以下の表は、コネクターによるバイナリーおよび文字 LOB (Large Object) 型へのマッピング方法を説明しています。

表6.6 Oracle バイナリーおよび文字 LOB 型のマッピング

Oracle データ型リテラル型 (スキーマ型)セマンティック型 (スキーマ名) および注記

BLOB

BYTES

raw バイト。

CLOB

STRING

該当なし

LONG

該当なし

このデータタイプはサポートされていません。

LONG RAW

該当なし

このデータタイプはサポートされていません。

NCLOB

STRING

該当なし

RAW

該当なし

このデータタイプはサポートされていません。

注記

Oracle は、CLOBNCLOB、および BLOB データタイプのカラム値を、SQL ステートメントで明示的に設定または変更された場合にのみ供給します。つまり、変更イベントには、変更されていないCLOBNCLOB、または BLOB 列の値が含まれることはなく、コネクターのプロパティーであるunavailable.value.placeholder で定義されるプレースホルダが含まれます。

CLOBNCLOB、または BLOB カラムの値が更新された場合、新しい値は対応する update change イベントの after 部分に含まれ、利用できない値のプレースホルダーは before 部分に使用されます。

数字型

以下の表は、コネクターによる数字型へのマッピング方法を説明しています。

表6.7 Oracle 数値データ型のマッピング

Oracle データ型リテラル型 (スキーマ型)セマンティック型 (スキーマ名) および注記

BINARY_FLOAT

FLOAT32

該当なし

BINARY_DOUBLE

FLOAT64

該当なし

DECIMAL[(P, S)]

BYTES / INT8 / INT16 / INT32 / INT64

org.apache.kafka.connect.data.Decimal BYTES を使用する場合:

NUMBER と同様に処理されます (DECIMAL の場合には S は 0 に初期設定されます)。

DOUBLE PRECISION

STRUCT

io.debezium.data.VariableScaleDecimal

転送された値のスケールが含まれる INT32 型の scale と、元の値がスケーリングされていない形式で含まれる BYTES 型の value の 2 つのフィールドがある構造が含まれます。

FLOAT[(P)]

STRUCT

io.debezium.data.VariableScaleDecimal

転送された値のスケールが含まれる INT32 型の scale と、元の値がスケーリングされていない形式で含まれる BYTES 型の value の 2 つのフィールドがある構造が含まれます。

INTEGER, INT

BYTES

org.apache.kafka.connect.data.Decimal

INTEGER は Oracle で NUMBER(38,0) にマップされるため、INT タイプよりも大きな値を保持することができます。

NUMBER[(P[, *])]

STRUCT

io.debezium.data.VariableScaleDecimal

転送された値のスケールが含まれる INT32 型の scale と、元の値がスケーリングされていない形式で含まれる BYTES 型の value の 2 つのフィールドがある構造が含まれます。

NUMBER(P, S <= 0)

INT8 / INT16 / INT32 / INT64

スケールが 0 の NUMBER 列は、整数を表します。負のスケールは Oracle での丸めを表します。たとえば、スケールが -2 の場合には、数百に丸められます。

以下のように、精度とスケーリングに応じて、一致する Kafka Connect の整数タイプのいずれかが選択されます。

  • P - S < 3, INT8
  • P - S < 5, INT16
  • P - S < 10, INT32
  • P - S < 19, INT64
  • P - S >= 19, BYTES (org.apache.kafka.connect.data.Decimal).

NUMBER(P, S > 0)

BYTES

org.apache.kafka.connect.data.Decimal

NUMERIC[(P, S)]

BYTES / INT8 / INT16 / INT32 / INT64

org.apache.kafka.connect.data.Decimal BYTES を使用する場合:

NUMBER と同様に処理されます (NUMERIC の場合には S は 0 に初期設定されます)。

SMALLINT

BYTES

org.apache.kafka.connect.data.Decimal

SMALLINT は Oracle で NUMBER(38,0) にマップされるため、INT タイプよりも大きな値を保持することができます。

REAL

STRUCT

io.debezium.data.VariableScaleDecimal

転送された値のスケールが含まれる INT32 型の scale と、元の値がスケーリングされていない形式で含まれる BYTES 型の value の 2 つのフィールドがある構造が含まれます。

ブール値型

Oracle ではネイティブで BOOLEAN データ型をサポートしていませが、特定のセマンティクスで他のデータ型を使用して、論理的に BOOLEAN データ型の概念をシミュレートするのが一般的です。

この演算子は、同梱の NumberOneToBooleanConverter カスタムコンバーターを設定できます。すべての NUMBER(1) 列を BOOLEAN にマッピングするか、selector パラメーターが設定されている場合には、コンマ区切りの正規表現を使用して、列のサブセットを列挙します。

以下は ConfigMap の例になります。

converters=boolean
boolean.type=io.debezium.connector.oracle.converters.NumberOneToBooleanConverter
boolean.selector=.*MYTABLE.FLAG,.*.IS_ARCHIVED

10 進数型

Oracle コネクター設定プロパティーの設定 decimal.handling.mode は、コネクターが 10 進数型をマッピングする方法を決定します。

decimal.handling.mode プロパティーが precise に設定されている場合には コネクターはDECIMALNUMERIC 列すべてに Kafka Connect org.apache.kafka.connect.data.Decimal 論理型を使用します。これはデフォルトのモードです。

ただし、decimal.handling.mode プロパティーが double に設定されている場合には、コネクターはスキーマタイプが FLOAT64 の Java の double 値として表します。

string オプションを使用するように decimal.handling.mode 設定プロパティーを設定することもできます。プロパティーが string に設定されている場合には、コネクターは DECIMALNUMERIC の値をスキーマタイプ STRING でフォーマットされた文字列表現として表します。

Temporal (一時) 型

Oracle の INTERVALTIMESTAMP WITH TIME ZONE、および TIMESTAMP WITH LOCAL TIME ZONE データ型を除き、他の一時型は time.precision.mode 設定プロパティーの値により異なります。

time.precision.mode 設定プロパティーが adaptive (デフォルト) に設定された場合、コネクターは列のデータ型を基に時間型のリテラルおよびセマンティック型を決定し、イベントが正確にデータベースの値を表すようにします。

Oracle データ型リテラル型 (スキーマ型)セマンティック型 (スキーマ名) および注記

DATE

INT64

io.debezium.time.Timestamp

エポック以降の経過時間をミリ秒で表し、タイムゾーン情報は含まれません。

INTERVAL DAY[(M)] TO SECOND

FLOAT64

io.debezium.time.MicroDuration
(デフォルト)
日数の月平均に 365.25 / 12.0 式を使用した時間間隔の概数 (ミリ秒単位)。

INTERVAL YEAR[(M)] TO MONTH

FLOAT64

io.debezium.time.MicroDuration
(デフォルト)
日数の月平均に 365.25 / 12.0 式を使用した時間間隔の概数 (ミリ秒単位)。

TIMESTAMP(0 - 3)

INT64

io.debezium.time.Timestamp

エポック以降の経過時間をミリ秒で表し、タイムゾーン情報は含まれません。

TIMESTAMP, TIMESTAMP(4 - 6)

INT64

io.debezium.time.MicroTimestamp

エポックからの経過時間をマイクロ秒で表し、タイムゾーン情報は含まれません。

TIMESTAMP(7 - 9)

INT64

io.debezium.time.NanoTimestamp

エポックからの経過時間をナノ秒で表し、タイムゾーン情報は含まれません。

TIMESTAMP WITH TIME ZONE

STRING

io.debezium.time.ZonedTimestamp

タイムゾーン情報を含むタイムスタンプの文字列表現。

TIMESTAMP WITH LOCAL TIME ZONE

STRING

io.debezium.time.ZonedTimestamp

UTC のタイムスタンプの文字列表現。

time.precision.mode 設定プロパティーが connect に設定された場合、コネクターは事前定義された Kafka Connect の論理型を使用します。これは、コンシューマーが組み込みの Kafka Connect の論理型のみを認識し、可変精度の時間値を処理できない場合に便利です。Oracle がサポートする精度レベルは、Kafka Connect サポートの論理型を超過するため、time.precision.modeconnectに設定していて、データベース列の fractional second precision の値が 3 より大きい場合には a loss of precision という結果になります。

Oracle データ型リテラル型 (スキーマ型)セマンティック型 (スキーマ名) および注記

DATE

INT32

org.apache.kafka.connect.data.Date

エポックからの日数を表します。

INTERVAL DAY[(M)] TO SECOND

FLOAT64

io.debezium.time.MicroDuration
(デフォルト)
日数の月平均に 365.25 / 12.0 式を使用した時間間隔の概数 (ミリ秒単位)。

INTERVAL YEAR[(M)] TO MONTH

FLOAT64

io.debezium.time.MicroDuration
(デフォルト)
日数の月平均に 365.25 / 12.0 式を使用した時間間隔の概数 (ミリ秒単位)。

TIMESTAMP(0 - 3)

INT64

org.apache.kafka.connect.data.Timestamp

エポックからの経過時間をミリ秒で表し、タイムゾーン情報は含まれません。

TIMESTAMP(4 - 6)

INT64

org.apache.kafka.connect.data.Timestamp

エポックからの経過時間をミリ秒で表し、タイムゾーン情報は含まれません。

TIMESTAMP(7 - 9)

INT64

org.apache.kafka.connect.data.Timestamp

エポックからの経過時間をミリ秒で表し、タイムゾーン情報は含まれません。

TIMESTAMP WITH TIME ZONE

STRING

io.debezium.time.ZonedTimestamp

タイムゾーン情報を含むタイムスタンプの文字列表現。

TIMESTAMP WITH LOCAL TIME ZONE

STRING

io.debezium.time.ZonedTimestamp

UTC のタイムスタンプの文字列表現。