apache/seatunnel · error · org.apache.seatunnel.common.exception.SeaTunnelRuntimeException

COMMON-17

COMMON-17

Error message

'<identifier>' unsupported convert type '<dataType>' of '<field>' to SeaTunnel data type.

What it means

Thrown by MySqlTypeConverter.convert() when a MySQL column type has no mapping to a SeaTunnel data type. The converter handles known MySQL types (TIMESTAMP -> OFFSET_DATE_TIME, etc.); the default branch fires for unrecognized or unsupported type strings. This aborts schema conversion of the MySQL source before data reading.

Source

Thrown at seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/mysql/MySqlTypeConverter.java:329

                break;
            case MYSQL_DATE:
                builder.dataType(LocalTimeType.LOCAL_DATE_TYPE);
                break;
            case MYSQL_TIME:
                builder.dataType(LocalTimeType.LOCAL_TIME_TYPE);
                builder.scale(typeDefine.getScale());
                break;
            case MYSQL_DATETIME:
                builder.dataType(LocalTimeType.LOCAL_DATE_TIME_TYPE);
                builder.scale(typeDefine.getScale());
                break;
            case MYSQL_TIMESTAMP:
                // MySQL TIMESTAMP is LTZ (stored as UTC, displayed in session timezone)
                builder.dataType(LocalTimeType.OFFSET_DATE_TIME_TYPE);
                builder.scale(typeDefine.getScale());
                break;
            default:
                throw CommonError.convertToSeaTunnelTypeError(
                        DatabaseIdentifier.MYSQL, mysqlDataType, typeDefine.getName());
        }
        return builder.build();
    }

    @Override
    public BasicTypeDefine<MysqlType> reconvert(Column column) {
        BasicTypeDefine.BasicTypeDefineBuilder builder =
                BasicTypeDefine.<MysqlType>builder()
                        .name(column.getName())
                        .nullable(column.isNullable())
                        .comment(column.getComment())
                        .defaultValue(column.getDefaultValue());
        switch (column.getDataType().getSqlType()) {
            case NULL:
                builder.nativeType(MysqlType.NULL);
                builder.columnType(MYSQL_NULL);
                builder.dataType(MYSQL_NULL);

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Read '<dataType>' from the message to find the unsupported MySQL column and its field name.
  2. Exclude the column via explicit SELECT projection or configure the source to skip that table.
  3. Cast the column in a custom SQL (e.g. ST_AsText(geom) or CAST(col AS CHAR)) so it maps to STRING.
  4. Upgrade SeaTunnel — newer versions add MySQL type mappings (e.g. geometry/vector support).
  5. Add a case in MySqlTypeConverter.convert() and contribute upstream.

Example fix

// before
SELECT * FROM places; -- GEOMETRY col fails
// after
SELECT id, ST_AsText(location) AS location FROM places;
Defensive patterns

Strategy: validation

Validate before calling

// Validate MySQL source columns are mappable before job start
for (BasicTypeDefine c : mysqlTableColumns) {
    try { new MySqlTypeConverter().convert(c); }
    catch (SeaTunnelRuntimeException e) {
        throw new IllegalStateException("Unsupported MySQL type " + c.getDataType() + " on column " + c.getName());
    }
}

Type guard

boolean isMySqlTypeSupported(BasicTypeDefine td) {
    try { new MySqlTypeConverter().convert(td); return true; }
    catch (SeaTunnelRuntimeException e) { return false; }
}

Try / catch

try {
    converter.convert(typeDefine);
} catch (SeaTunnelRuntimeException e) {
    if (e.getMessage().contains("unsupported convert type")) {
        LOG.error("Exclude/cast column {} ({})", typeDefine.getName(), typeDefine.getDataType());
    }
    throw e;
}

Prevention

When it happens

Trigger: convert(BasicTypeDefine) on MySqlTypeConverter with a mysqlDataType not in the switch at MySqlTypeConverter.java:329 — e.g. GEOMETRY/POINT spatial types, JSON in old connector versions, BIT beyond handled widths, or vendor-extended type names reported by unusual MySQL-compatible databases.

Common situations: Reading tables with MySQL spatial (GEOMETRY) columns; MySQL-compatible databases (TiDB, Percona variants) reporting nonstandard type names; older MySQL 5.x types or set/enum columns in versions lacking support.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/4ebc2b30bf74e522. Report an issue: GitHub.