5.3. Debezium MySQL コネクターによるデータ型のマッピング方法
Debezium MySQL コネクターは、行が存在するテーブルのように構造化されたイベントで行への変更を表します。イベントには、各列の値のフィールドが含まれます。その列の MySQL データ型は、イベントの値を表す方法を指定します。
文字列を格納する列は、文字セットと照合順序を使用して MySQL に定義されます。MySQL コネクターは、binlog イベントの列値のバイナリー表現を読み取るときに、列の文字セットを使用します。
コネクターは MySQL データ型を リテラル 型および セマンティック 型の両方にマップできます。
- リテラル型: Kafka Connect スキーマタイプを使用して値がどのように表されるか。
- セマンティック型: Kafka Connect スキーマがどのようにフィールド (スキーマ名) の意味をキャプチャーするか。
デフォルトのデータ型変換がニーズを満たさない場合は、コネクター のカスタムコンバーターを作成 できます。
詳細は以下を参照してください。
基本型
以下の表は、コネクターによる基本的な MySQL データ型のマッピング方法を示しています。
表5.13 基本型のマッピングの説明
| MySQL 型 | リテラル型 | セマンティック型 |
|---|---|---|
|
|
| 該当なし |
|
|
| 該当なし |
|
|
|
|
|
|
| 該当なし |
|
|
| 該当なし |
|
|
| 該当なし |
|
|
| 該当なし |
|
|
| 該当なし |
|
|
| 該当なし |
|
|
|
精度は、ストレージサイズを決定するためにのみ使用されます。0 から 23 までの精度 |
|
|
|
MySQL 8.0.17 の時点では、非標準の FLOAT (M,D)および DOUBLE (M,D) 構文は非推奨となり、そのサポートが今後の MySQL バージョンで削除される予定です。 |
|
|
| 該当なし |
|
|
| 該当なし |
|
|
| 該当なし |
|
|
|
該当なし |
|
|
|
該当なし |
|
|
|
該当なし |
|
|
| 該当なし |
|
|
|
該当なし |
|
|
|
n/a |
|
|
|
該当なし |
|
|
| 該当なし |
|
|
|
該当なし |
|
|
|
n/a |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
時間型
TIMESTAMP データ型を除き、MySQL の時間型は time.precision.mode コネクター設定プロパティーの値によって異なります。デフォルト値が CURRENT_TIMESTAMP または NOW として指定される TIMESTAMP 列では、Kafka Connect スキーマのデフォルト値として値 1970-01-01 00:00:00 が使用されます。
MySQL では、ゼロの値は null よりも優先されることがあるため、DATE、DATETIME、および TIMESTAMP 列にゼロの値を使用できます。MySQL コネクターは、列定義で null 値が許可される場合はゼロの値を null 値として表し、列で null 値が許可されない場合はエポック日として表します。
タイムゾーンのない時間型
DATETIME 型は、2018-01-13 09:48:27 のようにローカルの日時を表します。タイムゾーンの情報は含まれません。このような列は、UTC を使用して列の精度に基づいてエポックミリ秒またはマイクロ秒に変換されます。TIMESTAMP 型は、タイムゾーン情報のないタイムスタンプを表します。これは、書き込み時に MySQL によってサーバー (またはセッション) の現在のタイムゾーンから UTC に変換され、値を読み戻すときに UTC からサーバー (またはセッション) の現在のタイムゾーンに変換されます。以下はその例です。
-
値が
2018-06-20 06:37:03のDATETIMEは、1529476623000になります。 -
値が
2018-06-20 06:37:03のTIMESTAMPは2018-06-20T13:37:03Zになります。
このような列は、サーバー (またはセッション) の現在のタイムゾーンに基づいて、UTC の同等の io.debezium.time.ZonedTimestamp に変換されます。タイムゾーンは、デフォルトでサーバーからクエリーされます。これに失敗した場合は、データベース connectionTimeZone MySQL 設定オプションで明示的に指定される必要があります。たとえば、データベースのタイムゾーン (グローバルなタイムゾーンまたは connectionTimeZone オプションを使用してコネクターのために設定) が America/Los_Angeles である場合、値 2018-06-20T13:37:03Z を持つ ZonedTimestamp によって TIMESTAMP 値の 2018-06-20 06:37:03 が表されます。
Kafka Connect および Debezium を実行している JVM のタイムゾーンは、これらの変換には影響しません。
時間値に関連するプロパティーの詳細は、MySQL コネクター設定プロパティー のドキュメントを参照してください。
- time.precision.mode=adaptive_time_microseconds(default)
MySQL コネクターは、イベントがデータベースの値を正確に表すようにするため、列のデータ型定義に基づいてリテラル型とセマンテック型を判断します。すべての時間フィールドはマイクロ秒単位です。正しくキャプチャーされる
TIMEフィールドの値は、範囲が00:00:00.000000から23:59:59.999999までの正の値です。表5.14
time.precision.mode=adaptive_time_microsecondsの場合のマッピングMySQL 型 リテラル型 セマンティック型 DATEINT32io.debezium.time.Date
エポックからの日数を表します。TIME[(M)]INT64io.debezium.time.MicroTime
時間の値をマイクロ秒単位で表し、タイムゾーン情報は含まれません。MySQL では、Mを0-6の範囲にすることができます。DATETIME, DATETIME(0), DATETIME(1), DATETIME(2), DATETIME(3)INT64io.debezium.time.Timestamp
エポックからの経過時間をミリ秒で表し、タイムゾーン情報は含まれません。DATETIME(4), DATETIME(5), DATETIME(6)INT64io.debezium.time.MicroTimestamp
エポックからの経過時間をマイクロ秒で表し、タイムゾーン情報は含まれません。- time.precision.mode=connect
MySQL コネクターは定義された Kafka Connect の論理型を使用します。この方法はデフォルトの方法よりも精度が低く、データベース列に
3を超える 少数秒の精度値がある場合は、イベントの精度が低くなる可能性があります。00:00:00.000から23:59:59.999までの値のみを処理できます。テーブルのtime.precision.mode=connectの値が、必ずサポートされる範囲内になるようにすることができる場合のみ、TIMEを設定します。connect設定は、今後の Debezium バージョンで削除される予定です。表5.15
time.precision.mode=connectの場合のマッピングMySQL 型 リテラル型 セマンティック型 DATEINT32org.apache.kafka.connect.data.Date
エポックからの日数を表します。TIME[(M)]INT64org.apache.kafka.connect.data.Time
午前 0 時以降の時間値をマイクロ秒で表し、タイムゾーン情報は含まれません。DATETIME[(M)]INT64org.apache.kafka.connect.data.Timestamp
エポックからの経過時間をミリ秒で表し、タイムゾーン情報は含まれません。
10 進数型
Debezium コネクターは、decimal.handling.mode コネクター設定プロパティー の設定にしたがって 10 進数を処理します。
- decimal.handling.mode=precise
表5.16
decimal.handling.mode=preciseの場合のマッピングMySQL 型 リテラル型 セマンティック型 NUMERIC[(M[,D])]BYTESorg.apache.kafka.connect.data.Decimal
scaleスキーマパラメーターには、小数点を移動した桁数を表す整数が含まれます。DECIMAL[(M[,D])]BYTESorg.apache.kafka.connect.data.Decimal
scaleスキーマパラメーターには、小数点を移動した桁数を表す整数が含まれます。- decimal.handling.mode=double
表5.17
decimal.handling.mode=doubleの場合のマッピングMySQL 型 リテラル型 セマンティック型 NUMERIC[(M[,D])]FLOAT64該当なし
DECIMAL[(M[,D])]FLOAT64該当なし
- decimal.handling.mode=string
表5.18
decimal.handling.mode=stringの場合のマッピングMySQL 型 リテラル型 セマンティック型 NUMERIC[(M[,D])]STRING該当なし
DECIMAL[(M[,D])]STRING該当なし
ブール値
MySQL は、特定の方法で BOOLEAN の値を内部で処理します。BOOLEAN 列は、内部で TINYINT(1) データ型にマッピングされます。ストリーミング中にテーブルが作成されると、Debezium は元の DDL を受信するため、適切な BOOLEAN マッピングが使用されます。スナップショットの作成中、Debezium は SHOW CREATE TABLE を実行して、BOOLEAN と TINYINT(1) の両方のカラムに TINYINT(1) を返すテーブル定義を取得します。その後、Debezium は元の型のマッピングを取得する方法はないため、TINYINT(1) にマッピングします。
ソース列をブール値データ型に変換できるように、Debezium は TinyIntOneToBooleanConverter カスタムコンバーター を提供し、以下のいずれかの方法で使用することができます。
-
すべての
TINYINT(1)またはTINYINT(1) UNSIGNED列をBOOLEAN型にマップします。 正規表現のコンマ区切りリストを使用して、列のサブセットを列挙します。
このタイプの変換を使用するには、以下の例のようにselectorパラメーターを使用してconverters設定プロパティーを設定する必要があります。converters=boolean boolean.type=io.debezium.connector.mysql.converters.TinyIntOneToBooleanConverter boolean.selector=db1.table1.*, db1.table2.column1
注:MySQL8 では、
SHOW CREATE TABLEを実行時にtinyint unsigned型の長さが表示されないため、このコンバータは機能しません。新しいオプションlength.checkerはこの問題を解決することができます。デフォルト値はtrueです。length.checkerを無効にし、以下の例のように、タイプに基づいてすべての列を変換するのではなく、変換が必要な列をselectorプロパティーに指定します。converters=boolean boolean.type=io.debezium.connector.mysql.converters.TinyIntOneToBooleanConverter boolean.length.checker=false boolean.selector=db1.table1.*, db1.table2.column1
空間型
現在、Debezium MySQL コネクターは以下の空間データ型をサポートしています。
表5.19 空間型マッピングの説明
| MySQL 型 | リテラル型 | セマンティック型 |
|---|---|---|
|
|
|
|