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

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

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

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

文字型

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

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

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

CHAR[(M)]

STRING

該当なし

NCHAR[(M)]

STRING

該当なし

NVARCHAR2[(M)]

STRING

該当なし

VARCHAR[(M)]

STRING

該当なし

VARCHAR2[(M)]

STRING

該当なし

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

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

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

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

BLOB

該当なし

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

CLOB

該当なし

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

LONG

該当なし

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

LONG RAW

該当なし

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

NCLOB

該当なし

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

RAW

該当なし

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

数値型

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

表6.5 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 に初期設定されます)。

ダブル精度

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 データ型の概念をシミュレートするのが一般的です。

演算子は、すべての 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 プロパティーが exact に設定されている場合 コネクターはすべての DECI MAL および NUMERIC 列に Kafka Connect org.apache.kafka.connect.data.Decimal logical type を使用します。これがデフォルトのモードです。

ただし 、10 進数.handling.mode プロパティーが double に設定された場合、コネクターはスキーマ type FLOAT64 を持つ Java の二重値として表します。

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

時間型

Oracle の INTERVAL WITH 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

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

タイムスタンプ、タイムスタンプ(4 - 6)

INT64

io.debezium.time.MicroTimestamp

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

TIMESTAMP(7 - 9)

INT64

io.debezium.time.NanoTimestamp

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

タイムゾーンを含むタイムスタンプ

STRING

io.debezium.time.ZonedTimestamp

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

ローカルタイムゾーンを含むタイムスタンプ

STRING

io.debezium.time.ZonedTimestamp

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

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

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

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

タイムゾーンを含むタイムスタンプ

STRING

io.debezium.time.ZonedTimestamp

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

ローカルタイムゾーンを含むタイムスタンプ

STRING

io.debezium.time.ZonedTimestamp

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