Class MySqlValueConverters
- All Implemented Interfaces:
ValueConverterProvider
This class always uses UTC for the default time zone when converting values without timezone information to values that require
timezones. This is because MySQL TIMESTAMP
values are always
stored in UTC (unlike DATETIME
values) and
are replicated in this form. Meanwhile, the MySQL Binlog Client library will deserialize
these as Timestamp
values that have no timezone and, therefore, are presumed to be in UTC.
When the column is properly marked with a Types.TIMESTAMP_WITH_TIMEZONE
type, the converters will need to convert
that Timestamp
value into an OffsetDateTime
using the default time zone, which always is UTC.
- Author:
- Randall Hauch
- See Also:
-
AbstractRowsEventDataDeserializer
-
Nested Class Summary
Nested ClassesNested classes/interfaces inherited from class io.debezium.jdbc.JdbcValueConverters
JdbcValueConverters.BigIntUnsignedMode, JdbcValueConverters.DecimalMode
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final Pattern
Used to parse values of DATE columns.private static final org.slf4j.Logger
private final MySqlValueConverters.ParsingErrorHandler
private static final Pattern
Used to parse values of TIME columns.private static final Pattern
Used to parse values of TIMESTAMP columns.Fields inherited from class io.debezium.jdbc.JdbcValueConverters
adaptiveTimeMicrosecondsPrecisionMode, adaptiveTimePrecisionMode, adjuster, bigIntUnsignedMode, binaryMode, decimalMode, defaultOffset, fallbackTimestampWithTimeZone, logger
-
Constructor Summary
ConstructorsConstructorDescriptionMySqlValueConverters
(JdbcValueConverters.DecimalMode decimalMode, TemporalPrecisionMode temporalPrecisionMode, JdbcValueConverters.BigIntUnsignedMode bigIntUnsignedMode, CommonConnectorConfig.BinaryHandlingMode binaryMode) Create a new instance that always uses UTC for the default time zone when_needed converting values without timezone information to values that require timezones.MySqlValueConverters
(JdbcValueConverters.DecimalMode decimalMode, TemporalPrecisionMode temporalPrecisionMode, JdbcValueConverters.BigIntUnsignedMode bigIntUnsignedMode, CommonConnectorConfig.BinaryHandlingMode binaryMode, TemporalAdjuster adjuster, MySqlValueConverters.ParsingErrorHandler parsingErrorHandler) Create a new instance that always uses UTC for the default time zone when converting values without timezone information to values that require timezones. -
Method Summary
Modifier and TypeMethodDescriptionstatic Temporal
adjustTemporal
(Temporal temporal) A utility method that adjusts ambiguous 2-digit year values of DATETIME, DATE, and TIMESTAMP types using these MySQL-specific rules: Year values in the range 00-69 are converted to 2000-2069. Year values in the range 70-99 are converted to 1970-1999.protected ByteOrder
protected Charset
charsetFor
(Column column) Return theCharset
instance with the MySQL-specific character set name used by the given column.static boolean
containsZeroValuesInDatePart
(String timestampString, Column column, Table table) protected Object
convertBigInt
(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) protected Object
convertDurationToMicroseconds
(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) protected Object
convertEnumToString
(List<String> options, Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Converts a value object for a MySQLENUM
, which is represented in the binlog events as an integer value containing the index of the enum option.protected Object
convertFloat
(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) MySql reports FLOAT(p) values as FLOAT and DOUBLE.protected Object
convertGeometry
(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Convert the a value representing a GEOMETRYbyte[]
value to a Geometry value used in aSourceRecord
.protected Object
convertInteger
(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) protected Object
convertJson
(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) protected Object
convertPoint
(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Convert the a value representing a POINTbyte[]
value to a Point value used in aSourceRecord
.protected Object
convertSetToString
(List<String> options, Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Converts a value object for a MySQLSET
, which is represented in the binlog events contain a long number in which every bit corresponds to a different option.protected String
convertSetValue
(Column column, long indexes, List<String> options) protected Object
convertSmallInt
(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) protected Object
convertString
(Column column, org.apache.kafka.connect.data.Field fieldDefn, Charset columnCharset, Object data) protected Object
convertTimestampToLocalDateTime
(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) protected Object
convertUnsignedBigint
(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Convert the a value representing a Unsigned BIGINT value to the correct Unsigned INT representation.protected Object
convertUnsignedInt
(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Convert the a value representing a Unsigned INT value to the correct Unsigned INT representation.protected Object
convertUnsignedMediumint
(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Convert the a value representing a Unsigned MEDIUMINT value to the correct Unsigned SMALLINT representation.protected Object
convertUnsignedSmallint
(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Convert the a value representing a Unsigned SMALLINT value to the correct Unsigned SMALLINT representation.protected Object
convertUnsignedTinyint
(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Convert the a value representing a Unsigned TINYINT value to the correct Unsigned TINYINT representation.protected Object
convertYearToInt
(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Converts a value object for a MySQLYEAR
, which appear in the binlog as an integer though returns from the MySQL JDBC driver as either a short or aDate
.static void
defaultParsingErrorHandler
(String message, Exception exception) extractEnumAndSetOptions
(Column column) protected String
protected boolean
isGeometryCollection
(String upperCaseTypeName) Determine if the uppercase form of a column's type is geometry collection independent of JDBC driver or server version.protected boolean
Determine if the uppercase form of a column's type exactly matches or begins with the specified prefix.protected byte[]
normalizeBinaryData
(Column column, byte[] data) org.apache.kafka.connect.data.SchemaBuilder
schemaBuilder
(Column column) static Duration
stringToDuration
(String timeString) static LocalDate
stringToLocalDate
(String dateString, Column column, Table table) Methods inherited from class io.debezium.jdbc.JdbcValueConverters
convertBinary, convertBinaryToBase64, convertBinaryToBase64UrlSafe, convertBinaryToBytes, convertBinaryToHex, convertBit, convertBits, convertBits, convertBoolean, convertDateToEpochDays, convertDateToEpochDaysAsDate, convertDecimal, convertDouble, convertNumeric, convertReal, convertRowId, convertString, convertTime, convertTimestampToEpochMicros, convertTimestampToEpochMillis, convertTimestampToEpochMillisAsDate, convertTimestampToEpochNanos, convertTimestampWithZone, convertTimeToMicrosPastMidnight, convertTimeToMillisPastMidnight, convertTimeToMillisPastMidnightAsDate, convertTimeToNanosPastMidnight, convertTimeWithZone, convertTinyInt, convertValue, getTimePrecision, handleUnknownData, padLittleEndian, toBigDecimal, toByteBuffer, unexpectedBinary, withScaleAdjustedIfNeeded
-
Field Details
-
LOGGER
private static final org.slf4j.Logger LOGGER -
TIME_FIELD_PATTERN
Used to parse values of TIME columns. Format: 000:00:00.000000. -
DATE_FIELD_PATTERN
Used to parse values of DATE columns. Format: 000-00-00. -
TIMESTAMP_FIELD_PATTERN
Used to parse values of TIMESTAMP columns. Format: 000-00-00 00:00:00.000. -
parsingErrorHandler
-
-
Constructor Details
-
MySqlValueConverters
public MySqlValueConverters(JdbcValueConverters.DecimalMode decimalMode, TemporalPrecisionMode temporalPrecisionMode, JdbcValueConverters.BigIntUnsignedMode bigIntUnsignedMode, CommonConnectorConfig.BinaryHandlingMode binaryMode) Create a new instance that always uses UTC for the default time zone when_needed converting values without timezone information to values that require timezones.- Parameters:
decimalMode
- howDECIMAL
andNUMERIC
values should be treated; may be null ifJdbcValueConverters.DecimalMode.PRECISE
is to be usedtemporalPrecisionMode
- temporal precision mode based onTemporalPrecisionMode
bigIntUnsignedMode
- howBIGINT UNSIGNED
values should be treated; may be null ifJdbcValueConverters.BigIntUnsignedMode.PRECISE
is to be usedbinaryMode
- how binary columns should be represented
-
MySqlValueConverters
public MySqlValueConverters(JdbcValueConverters.DecimalMode decimalMode, TemporalPrecisionMode temporalPrecisionMode, JdbcValueConverters.BigIntUnsignedMode bigIntUnsignedMode, CommonConnectorConfig.BinaryHandlingMode binaryMode, TemporalAdjuster adjuster, MySqlValueConverters.ParsingErrorHandler parsingErrorHandler) Create a new instance that always uses UTC for the default time zone when converting values without timezone information to values that require timezones.- Parameters:
decimalMode
- howDECIMAL
andNUMERIC
values should be treated; may be null ifJdbcValueConverters.DecimalMode.PRECISE
is to be usedtemporalPrecisionMode
- temporal precision mode based onTemporalPrecisionMode
bigIntUnsignedMode
- howBIGINT UNSIGNED
values should be treated; may be null ifJdbcValueConverters.BigIntUnsignedMode.PRECISE
is to be usedbinaryMode
- how binary columns should be representedadjuster
- a temporal adjuster to make a database specific time modification before conversion
-
-
Method Details
-
adjustTemporal
A utility method that adjusts ambiguous 2-digit year values of DATETIME, DATE, and TIMESTAMP types using these MySQL-specific rules:- Year values in the range 00-69 are converted to 2000-2069.
- Year values in the range 70-99 are converted to 1970-1999.
- Parameters:
temporal
- the temporal instance to adjust; may not be null- Returns:
- the possibly adjusted temporal instance; never null
-
byteOrderOfBitType
- Overrides:
byteOrderOfBitType
in classJdbcValueConverters
-
schemaBuilder
- Specified by:
schemaBuilder
in interfaceValueConverterProvider
- Overrides:
schemaBuilder
in classJdbcValueConverters
-
converter
- Specified by:
converter
in interfaceValueConverterProvider
- Overrides:
converter
in classJdbcValueConverters
-
charsetFor
Return theCharset
instance with the MySQL-specific character set name used by the given column.- Parameters:
column
- the column in which the character set is used; never null- Returns:
- the Java
Charset
, or null if there is no mapping
-
convertJson
protected Object convertJson(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) - Parameters:
column
- the column in which the value appearsfieldDefn
- the field definition for theSourceRecord
'sSchema
; never nulldata
- the data; may be null- Returns:
- the converted value, or null if the conversion could not be made and the column allows nulls
- Throws:
IllegalArgumentException
- if the value could not be converted but the column does not allow nulls
-
convertSmallInt
protected Object convertSmallInt(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) - Overrides:
convertSmallInt
in classJdbcValueConverters
-
convertInteger
protected Object convertInteger(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) - Overrides:
convertInteger
in classJdbcValueConverters
-
convertBigInt
protected Object convertBigInt(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) - Overrides:
convertBigInt
in classJdbcValueConverters
-
convertFloat
protected Object convertFloat(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) MySql reports FLOAT(p) values as FLOAT and DOUBLE. A precision from 0 to 23 results in a 4-byte single-precision FLOAT column. A precision from 24 to 53 results in an 8-byte double-precision DOUBLE column. As of MySQL 8.0.17, the nonstandard FLOAT(M,D) and DOUBLE(M,D) syntax is deprecated, and should expect support for it be removed in a future version of MySQL. Based on this future, we didn't handle the case.- Overrides:
convertFloat
in classJdbcValueConverters
-
convertString
protected Object convertString(Column column, org.apache.kafka.connect.data.Field fieldDefn, Charset columnCharset, Object data) - Parameters:
column
- the column in which the value appearsfieldDefn
- the field definition for theSourceRecord
'sSchema
; never nullcolumnCharset
- the Java character set in which column byte[] values are encoded; may not be nulldata
- the data; may be null- Returns:
- the converted value, or null if the conversion could not be made and the column allows nulls
- Throws:
IllegalArgumentException
- if the value could not be converted but the column does not allow nulls
-
convertYearToInt
protected Object convertYearToInt(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Converts a value object for a MySQLYEAR
, which appear in the binlog as an integer though returns from the MySQL JDBC driver as either a short or aDate
.- Parameters:
column
- the column definition describing thedata
value; never nullfieldDefn
- the field definition; never nulldata
- the data object to be converted into a year literal integer value; never null- Returns:
- the converted value, or null if the conversion could not be made and the column allows nulls
- Throws:
IllegalArgumentException
- if the value could not be converted but the column does not allow nulls
-
convertEnumToString
protected Object convertEnumToString(List<String> options, Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Converts a value object for a MySQLENUM
, which is represented in the binlog events as an integer value containing the index of the enum option. The MySQL JDBC driver returns a string containing the option, so this method calculates the same.- Parameters:
options
- the characters that appear in the same order as defined in the column; may not be nullcolumn
- the column definition describing thedata
value; never nullfieldDefn
- the field definition; never nulldata
- the data object to be converted into anENUM
literal String value- Returns:
- the converted value, or null if the conversion could not be made and the column allows nulls
- Throws:
IllegalArgumentException
- if the value could not be converted but the column does not allow nulls
-
convertSetToString
protected Object convertSetToString(List<String> options, Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Converts a value object for a MySQLSET
, which is represented in the binlog events contain a long number in which every bit corresponds to a different option. The MySQL JDBC driver returns a string containing the comma-separated options, so this method calculates the same.- Parameters:
options
- the characters that appear in the same order as defined in the column; may not be nullcolumn
- the column definition describing thedata
value; never nullfieldDefn
- the field definition; never nulldata
- the data object to be converted into anSET
literal String value; never null- Returns:
- the converted value, or null if the conversion could not be made and the column allows nulls
- Throws:
IllegalArgumentException
- if the value could not be converted but the column does not allow nulls
-
matches
Determine if the uppercase form of a column's type exactly matches or begins with the specified prefix. Note that this logic works when the column'stype
contains the type name followed by parentheses.- Parameters:
upperCaseTypeName
- the upper case form of the column'stype name
upperCaseMatch
- the upper case form of the expected type or prefix of the type; may not be null- Returns:
true
if the type matches the specified type, orfalse
otherwise
-
isGeometryCollection
Determine if the uppercase form of a column's type is geometry collection independent of JDBC driver or server version.- Parameters:
upperCaseTypeName
- the upper case form of the column'stype name
- Returns:
true
if the type is geometry collection
-
extractEnumAndSetOptions
-
extractEnumAndSetOptionsAsString
-
convertSetValue
-
convertPoint
protected Object convertPoint(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Convert the a value representing a POINTbyte[]
value to a Point value used in aSourceRecord
.- Parameters:
column
- the column in which the value appearsfieldDefn
- the field definition for theSourceRecord
'sSchema
; never nulldata
- the data; may be null- Returns:
- the converted value, or null if the conversion could not be made and the column allows nulls
- Throws:
IllegalArgumentException
- if the value could not be converted but the column does not allow nulls
-
convertGeometry
protected Object convertGeometry(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Convert the a value representing a GEOMETRYbyte[]
value to a Geometry value used in aSourceRecord
.- Parameters:
column
- the column in which the value appearsfieldDefn
- the field definition for theSourceRecord
'sSchema
; never nulldata
- the data; may be null- Returns:
- the converted value, or null if the conversion could not be made and the column allows nulls
- Throws:
IllegalArgumentException
- if the value could not be converted but the column does not allow nulls
-
normalizeBinaryData
- Overrides:
normalizeBinaryData
in classJdbcValueConverters
-
convertUnsignedTinyint
protected Object convertUnsignedTinyint(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Convert the a value representing a Unsigned TINYINT value to the correct Unsigned TINYINT representation.- Parameters:
column
- the column in which the value appearsfieldDefn
- the field definition for theSourceRecord
'sSchema
; never nulldata
- the data; may be null- Returns:
- the converted value, or null if the conversion could not be made and the column allows nulls
- Throws:
IllegalArgumentException
- if the value could not be converted but the column does not allow nulls
-
convertUnsignedSmallint
protected Object convertUnsignedSmallint(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Convert the a value representing a Unsigned SMALLINT value to the correct Unsigned SMALLINT representation.- Parameters:
column
- the column in which the value appearsfieldDefn
- the field definition for theSourceRecord
'sSchema
; never nulldata
- the data; may be null- Returns:
- the converted value, or null if the conversion could not be made and the column allows nulls
- Throws:
IllegalArgumentException
- if the value could not be converted but the column does not allow nulls
-
convertUnsignedMediumint
protected Object convertUnsignedMediumint(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Convert the a value representing a Unsigned MEDIUMINT value to the correct Unsigned SMALLINT representation.- Parameters:
column
- the column in which the value appearsfieldDefn
- the field definition for theSourceRecord
'sSchema
; never nulldata
- the data; may be null- Returns:
- the converted value, or null if the conversion could not be made and the column allows nulls
- Throws:
IllegalArgumentException
- if the value could not be converted but the column does not allow nulls
-
convertUnsignedInt
protected Object convertUnsignedInt(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Convert the a value representing a Unsigned INT value to the correct Unsigned INT representation.- Parameters:
column
- the column in which the value appearsfieldDefn
- the field definition for theSourceRecord
'sSchema
; never nulldata
- the data; may be null- Returns:
- the converted value, or null if the conversion could not be made and the column allows nulls
- Throws:
IllegalArgumentException
- if the value could not be converted but the column does not allow nulls
-
convertUnsignedBigint
protected Object convertUnsignedBigint(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Convert the a value representing a Unsigned BIGINT value to the correct Unsigned INT representation.- Parameters:
column
- the column in which the value appearsfieldDefn
- the field definition for theSourceRecord
'sSchema
; never nulldata
- the data; may be null- Returns:
- the converted value, or null if the conversion could not be made and the column allows nulls
- Throws:
IllegalArgumentException
- if the value could not be converted but the column does not allow nulls
-
convertDurationToMicroseconds
protected Object convertDurationToMicroseconds(Column column, org.apache.kafka.connect.data.Field fieldDefn, Object data) Converts a value object for an expected type ofDuration
toLong
values that represents the time in microseconds.Per the JDBC specification, databases should return
Time
instances, but that's not working because it can only handle Daytime 00:00:00-23:59:59. We useDuration
instead that can handle the range of -838:59:59.000000 to 838:59:59.000000 of a MySQL TIME type and transfer data as signed INT64 which reflects the DB value converted to microseconds.- Parameters:
column
- the column definition describing thedata
value; never nullfieldDefn
- the field definition; never nulldata
- the data object to be converted into aDuration
type; never null- Returns:
- the converted value, or null if the conversion could not be made and the column allows nulls
- Throws:
IllegalArgumentException
- if the value could not be converted but the column does not allow nulls
-
convertTimestampToLocalDateTime
-
stringToDuration
-
stringToLocalDate
-
containsZeroValuesInDatePart
-
defaultParsingErrorHandler
-