Reference
Data type support by engine
Check which column types SQL Flow captures from each source engine and capture mode, and which types it refuses.
This page lists, per source engine and capture mode, the column types SQL Flow captures and the ones it refuses or handles with a caveat. For the type each target gets, see Data type mapping.
When SQL Flow can't carry a type exactly, it refuses the table by name at the start, or stops the pipeline with a message that names the column, rather than truncating or rounding the value. "Not tested" means the type's behavior isn't verified; test such a table before you rely on it.
SQL Server and Azure SQL
Azure SQL captures with Native CDC, so its column is the Native CDC column below.
| Type | DirectLog | Reconstruction | Polling | Native CDC |
|---|---|---|---|---|
bit, tinyint, smallint, int, bigint | Yes | Yes | Yes | Yes |
decimal, numeric (up to 38 digits), money, smallmoney | Yes | Yes | Yes | Yes |
real, float | Yes | Yes | Yes | Yes |
date, time, smalldatetime, datetime, datetime2, datetimeoffset | Yes | Yes | Yes | Yes |
char, varchar | Yes | Yes | Yes | Yes, when the column's code page matches the database's |
nchar, nvarchar | Yes | Yes | Yes | Yes |
binary, varbinary | Yes | Yes | Yes | Yes |
uniqueidentifier | Yes | Yes | Yes | Yes |
varchar(max), nvarchar(max), varbinary(max) | Yes | Yes, read by key | Yes; off-row values read by key | Yes |
text, ntext, image | Yes | Yes, with limits (see below) | Yes | Yes; text as for varchar |
xml, untyped | Yes | Yes | Yes | Yes |
xml typed by an XML schema collection | Refused | Refused | Refused | Refused |
json, vector | Yes | Yes | Yes | Yes |
hierarchyid | Yes | Yes | Yes | Yes |
geography, geometry | Yes | Yes | Yes | Yes |
rowversion (timestamp) | Yes | Yes | Yes | Yes |
| Alias (user-defined data) types | As their base type | As their base type | As their base type | As their base type |
sql_variant | Into SQL Server and Azure SQL targets, with limits (see below) | Into SQL Server and Azure SQL targets, with limits (see below) | Captured; SQL Server-family and PostgreSQL targets refuse it | Captured; SQL Server-family and PostgreSQL targets refuse it |
| CLR user-defined types | Captured as bytes, except in wide tables (see below); SQL Server-family and PostgreSQL targets refuse them | Refused | Captured as bytes; SQL Server-family and PostgreSQL targets refuse them | Refused |
| Persisted computed columns | Yes | Yes | Yes | Refused |
| Non-persisted computed columns | Not in the log; captured as NULL | Not in the log; captured as NULL | Not in the log; captured as NULL | Refused |
| Sparse columns | Yes | Yes, except sparse MAX and xml columns | Yes | Yes |
| Tables with a column set | Refused, because SQL Server can't mark them | Refused | Yes | Refused by SQL Server's CDC (error 22854) |
FILESTREAM | Read by key | Refused | Not tested | Not tested |
| Always Encrypted columns | Refused by default; ciphertext copy as an opt-in | Refused | Refused | Refused |
Notes for SQL Server
- Large values. DirectLog takes
varchar(max),nvarchar(max)andvarbinary(max)values from the log on SQL Server 2022 and 2025, andxmlon every supported version. Elsewhere, and in Polling and Reconstruction, an off-row value is read from the table by key, so it carries the row's current value. See Large values and LOBs. - Large values under DirectLog. When every target of the pipeline is Fabric Open Mirroring, a table whose large-value column (such as
varchar(max),varbinary(max),xml,json,textorimage) already holds a value larger than 1 MiB is refused at the start, and a larger value written later stops the pipeline. With any other target, DirectLog has no such limit. Once DirectLog marks a table withtext,ntextorimagecolumns for capture, SQL Server rejectsUPDATETEXT(error 7137) andWRITETEXT(error 7138) from your application, so replace those statements with ordinaryUPDATEstatements first. See DirectLog: Limitations. text,ntextandimageunder Reconstruction. Refused when the table stores them in row (text in row), or when its other columns let a row grow past 8,060 bytes.UPDATETEXTandWRITETEXTstop the pipeline. See Reconstruction: Limitations.- CLR user-defined types. DirectLog refuses a table with a CLR user-defined type column when the table also has a large-value column, or when its declared column widths let a row grow past 8,060 bytes, because it reads such rows back by key and can't read a CLR value that way. In other tables, DirectLog and Polling capture the value as its bytes. Under Native CDC, the capture stops by name when it first reads a table with such a column.
sql_variant. Under DirectLog and Reconstruction, SQL Server and Azure SQL targets get each value with its own base type, through ordered apply. The column can't be a key column, sparse, computed, in a column set or of an alias type, and the table can't have Always Encrypted columns; the Prepare step refuses such a column by name. Polling and Native CDC read the value without its base type, so SQL Server-family and PostgreSQL targets refuse the column: capture the table with DirectLog or Reconstruction, or deselect it on the Tables step. SQL database in Fabric targets refusesql_variantfrom every mode.- Sparse columns and column sets. Under DirectLog and Polling, a table with sparse columns and a dropped column that no rebuild has removed yet is refused: on SQL Server 2025 only when the table is partitioned, on earlier versions always. Run
ALTER TABLE <table> REBUILD, then start again. SQL Server can't mark a table with a column set for DirectLog or enable it for Native CDC (error 22854): drop the column set, whose sparse columns stay and are captured, or capture the table with Polling. A SQL Server table that Prepare target schema creates for a Polling source gets the same sparse columns and column set. - Added columns. An untyped
xmlcolumn added to a tracked table while the pipeline runs is captured under DirectLog and Reconstruction, and the target gets anxmlcolumn. Adding a column of typedxmlor of a CLR user-defined type stops DirectLog, Reconstruction and Polling with the schema history gap message below. Every restart, and Pause then Start, stops at the same change, even after you undo it on the source; only Reload from source continues. See Changes that stop the pipeline. - Non-persisted computed columns. A SQL Server-family table that Prepare target schema creates gets the same computed column, so the target computes it again.
- Key columns. On a SQL Server-family target, a key column can't be
hierarchyid,rowversion,xml,json,vector,geography,geometry,sql_variantor aMAXtype. The Prepare step refuses such a table by name. geographyandgeometryare carried as SQL Server's serialized bytes, and a PostgreSQL target refuses them. See Data type mapping.- Masked columns and
ANSI_PADDING OFF. DirectLog, Reconstruction and Polling refuse a column with a dynamic data mask that the login can'tUNMASK, and a nullablecharorbinarycolumn created withANSI_PADDING OFF. - Always Encrypted. See Encrypted data support.
Messages you can see:
A column of xml typed by an XML schema collection, at the start:
typed_xml_schema_collection: selected column <table>.<column> is XML(<DOCUMENT|CONTENT> <collection>); typed XML schema-collection identity and definitions are not supported by this capture/provisioning route. Refusing to flatten it to untyped xml.A sql_variant column from Polling or Native CDC into a SQL Server or Azure SQL target, on the Prepare step. Under DirectLog and Reconstruction, the reason instead names a key column, or a sparse, computed, column-set or alias-typed declaration:
Table '<table>', column '<column>' (sql_variant): sql_variant remains deferred for this capture: only DirectLog and Reconstruction into a SQL Server or Azure SQL target carry each value's own base type exactly; Built-in CDC and Polling read it as a plain value, which would lose that type. To continue: ...A DirectLog table with a column set:
a decodable storage kind for tracked table <table> (the table is with a sparse COLUMN_SET: SQL Server refuses to mark it for capture (sys.sp_cdc_enable_table raises error 22854: CDC does not support a COLUMN_SET), ...A DirectLog table with large values or wide rows and a column that can't be read back by key, such as a CLR user-defined type:
complete-row LOB fetch projection for table <table> (column '<column>' with SQL type '<type>' cannot be fetched: its value encoding is unsupported. ...A table with sparse columns and a dropped column that no rebuild has removed, under DirectLog or Polling:
Tables with SPARSE columns and a dropped-but-not-rebuilt column are not supported in <mode> mode: <tables>. ...An added column of typed xml or of a CLR user-defined type, while the pipeline runs. The reason names the column, for example column '<column>' is typed xml (xml_collection_id <n>); ... Refusing to flatten it to untyped xml:
SQL Server log-native schema history gap for '<table>': <reason>. No successor plan, row output, or checkpoint was published. A restart, or Pause → Start, reads this change from the log again and stops here, also after the change is undone at the source; Reload from source starts the pipeline over from a fresh copy.A Native CDC column of a CLR user-defined type, the only column type that raises it:
NativeCdcUnsupportedProviderType: column '<column>' of '<table>' has type '<type>'; its retained provider bytes cannot be bounded before materialization. No checkpoint was advanced.A Native CDC computed column:
native_cdc_computed_column: Native capture refuses selected column <table>.<column>: CDC records computed cells as NULL and the original captured column/dependency identity or supported historical expression is unproved.A table shape Reconstruction can't capture, such as a CLR user-defined type column:
Reconstruction refuses table <table>: it <reason>; remove the table from the pipeline's scope, or capture it with Polling or Native CDC.Oracle
| Type | DirectLog | LogMiner |
|---|---|---|
NUMBER, FLOAT | Yes | Yes |
BINARY_FLOAT, BINARY_DOUBLE | Yes, including NaN and infinities, also in keys | Yes, including NaN and infinities, also in keys |
CHAR, VARCHAR2, NCHAR, NVARCHAR2 | Yes, in the supported database character sets (see below) | Yes |
Extended-width VARCHAR2, NVARCHAR2 (over 4,000 bytes) and RAW (over 2,000 bytes) | Not tested | Refused |
DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE | Yes | Yes |
INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND | Yes, as canonical interval text | Yes, as canonical interval text |
RAW | Yes | Yes |
LONG, LONG RAW | Yes, with limits (see below) | Yes, with limits (see below) |
BLOB, CLOB, NCLOB | SecureFile, not partitioned, with RETENTION MIN of at least 3,600 seconds and Flashback Database on, or RETENTION MAX with a MAXSIZE | Yes; values LogMiner doesn't return in full are read as of the commit SCN |
XMLTYPE stored as CLOB | Yes | Yes |
XMLTYPE stored as binary, transportable binary or object-relational XML | Refused | Refused |
ROWID, UROWID | Yes | Yes |
BOOLEAN | Yes | Refused |
JSON | Yes | Refused |
VECTOR | Yes | Refused |
Object types with scalar attributes, SDO_GEOMETRY | Yes, flattened to one column per attribute | Yes, flattened to one column per attribute |
VARRAY of scalars or of objects with scalar attributes | Yes, as a JSON array | Yes |
Nested tables, BFILE, REF, ANYDATA, ANYTYPE, ANYDATASET, and the URI types URITYPE, HTTPURITYPE, DBURITYPE and XDBURITYPE | Refused | Refused |
| Virtual (generated) columns | Refused | Not tested |
| Columns in a TDE-encrypted tablespace, encrypted columns, encrypted SecureFile LOBs | Refused by name | Yes, decrypted by the database while its TDE keystore is open |
Notes for Oracle
- Encryption. DirectLog can't decrypt, so it refuses a table in an encrypted tablespace, or with encrypted columns or LOBs, by name before the initial load. LogMiner captures them while the TDE keystore is open, and stops by name when it can't show a value, for example while the keystore is closed. See Encrypted data support.
- Numbers. A
NUMBERvalue too large or too precise for a decimal is carried as exact text, never rounded. - Character sets. DirectLog decodes text itself, so the database character set (
NLS_CHARACTERSET) must beAL32UTF8,UTF8,US7ASCII,WE8ISO8859P1,WE8MSWIN1252,WE8ISO8859P15orWE8PC850. Any other is refused at the start. A stored value with bytes that the character set doesn't define stops capture rather than being written with replacement characters. LogMiner works with every character set. - Large values. DirectLog reads some
BLOB,CLOBandNCLOBvalues from the table as of the commit, so it needs SecureFile retention and guaranteed undo.RETENTION MINkeeps old LOB versions only while Flashback Database is on, soRETENTION MINwith Flashback Database off is refused: turn Flashback Database on, or useRETENTION MAXwith aMAXSIZE. See Oracle DirectLog requirements and Large values and LOBs. LONGandLONG RAW. Under DirectLog, an update that re-chains a row's value across blocks, for example by growing it, stops capture by name; capture such tables with LogMiner. Under LogMiner, a value LogMiner doesn't return is read from the table as of the commit, which needsFLASHBACKon the table and enough undo. The initial load in both modes, and LogMiner's reads as of the commit, refuse a value larger than 16 MiB.- LogMiner refusals. A table with a native
BOOLEAN,JSONorVECTORcolumn is refused at the start, because LogMiner returns no usable changes for it. Capture it with DirectLog, or store JSON in aCLOBorBLOBwith anIS JSONconstraint. A table with an extended-widthVARCHAR2orNVARCHAR2column over 4,000 bytes, orRAWcolumn over 2,000 bytes (MAX_STRING_SIZE=EXTENDED), is refused too, because LogMiner can report a placeholder instead of the value. - Types neither mode captures. A table with a
BFILE,REF, nested-table,ANYDATA,ANYTYPE,ANYDATASETor URI-type column is refused by name in both modes. Remove the table from the pipeline, or change the column's type.
Messages you can see:
Table <schema>.<table> has a native JSON column "<column>", which DBMS_LOGMNR reports as OPERATION=UNSUPPORTED and cannot capture: ...Table <schema>.<table> has an extended-width <type>(<length>) column "<column>" (MAX_STRING_SIZE=EXTENDED). Oracle LogMiner can report a placeholder instead of values wider than the standard limit, so SqlFlow refuses LogMiner capture of this table; exclude it from LogMiner capture.Table <schema>.<table> has a <type> column "<column>", which Oracle lists as unsupported by DBMS_LOGMNR: the table would silently produce no usable DML records. No SqlFlow capture mode supports this column type (DirectLog refuses it too); exclude this table from capture.<schema>.<table>: virtual/generated column(s) <columns> are not stored as ordinary redo fields. DirectLog refuses this table rather than risk shifting the physical column layout.<schema>.<table>: XMLTYPE column(s) <columns> are not proven CLOB-backed. DirectLog currently supports only XMLTYPE stored as CLOB; binary, transportable-binary, and object-relational XML must fail closed.Oracle XMLTYPE text projection requires catalog-proven CLOB storage; binary and object-relational XML representations are refused.Oracle database character set '<name>' is not supported for raw value decoding.DirectLog does not yet reconstruct a re-chained LONG/LONG RAW row update (its last-piece marker is carried by an OP 11.8 forwarding change); capture this table with LogMiner.oracle_long_prefetch_value_exceeds_allowance: complete bounded original-result LONG acquisition is required.PostgreSQL
SQL Flow doesn't refuse any column type at the start; a value it can't decode stops the pipeline.
| Type | Support |
|---|---|
boolean, smallint, integer, bigint, real, double precision | Yes |
numeric, decimal | Yes. A value too wide for a decimal is carried as an exact number or exact text. NaN and infinities are carried as floating-point values. |
money | Yes |
char, varchar, text | Yes |
bytea | Yes |
uuid | Yes |
date, time, timestamp, timestamptz | Yes |
interval | Yes, as interval text that keeps its months, days and microseconds. An interval with months or years isn't tested into targets other than PostgreSQL. |
json, jsonb | Yes |
| Composite types | Captured as record text, such as (1,NY). A field whose type isn't a character type, boolean, an integer type, numeric or uuid is carried as hexadecimal bytes, not its text form. |
Arrays, enums, ranges, domains, hstore, bit strings, geometric types, tsvector, xml, timetz, oid, name, and extension types such as PostGIS | Not tested |
inet, cidr, macaddr | Not tested; an inet value loses its netmask |
Large (TOAST) values left unchanged by an UPDATE | Not resent by PostgreSQL; the target keeps its value |
See Logical replication: Column types.
MySQL
| Type | Support |
|---|---|
TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT, signed and unsigned | Yes |
DECIMAL, NUMERIC | Yes. A value too wide for a decimal is carried as an exact number or exact text. |
FLOAT, DOUBLE | Yes |
BIT | Yes, as an unsigned integer |
CHAR, VARCHAR, TINYTEXT to LONGTEXT | Yes, decoded in the column's character set. Text in armscii8, dec8, geostd8, hp8, keybcs2 or swe7 is read as UTF-8, so a value that isn't valid UTF-8 arrives as bytes. |
BINARY, VARBINARY, TINYBLOB to LONGBLOB | Yes |
DATE, TIME, DATETIME, YEAR | Yes. A zero date (0000-00-00), or a date with a zero month or day, is carried as 0001-01-01. YEAR 0000 stays 0. |
TIMESTAMP | Yes, as UTC. A zero value is carried as 0001-01-01. |
ENUM, SET | Yes, as their labels |
JSON | Yes, as JSON text. A decimal, date, time or binary value that MySQL stores inside the document in its own format, for example from JSON_OBJECT over a DECIMAL or DATE column, is carried as a string that starts with opaque:. |
GEOMETRY and other spatial types | Captured as MySQL's internal bytes: an SRID followed by WKB |
| Generated columns | Not tested |
MariaDB UUID, INET4, INET6 | Not tested |
Column types SQL Flow can't decode from the binlog, such as MySQL 9 VECTOR | Not refused at the start; the first change to the table stops the pipeline |
A column type SQL Flow can't decode from the binlog stops the pipeline at the first change to the table, usually with Unsupported column type: <type> (0x<code>). Remove the table from the pipeline. See Binlog: Unsupported column type.
Partial JSON updates (binlog_row_value_options set to PARTIAL_JSON) are refused at the start. If the setting changes later, capture stops with a message that starts Encountered a PARTIAL_UPDATE_ROWS_EVENT (binlog event type 39). Set binlog_row_value_options to an empty string, then reload the pipeline. See Binlog: Partial JSON update in the binlog.
Sybase ASE
An alias type is captured as its base type.
| Type | DirectLog | Reconstruction |
|---|---|---|
tinyint, smallint, int, bigint, and the unsigned integer types | Yes, unsigned types at their full range | Yes, unsigned types at their full range |
numeric, decimal | Yes, up to precision 38 | Yes, up to precision 38 |
money, smallmoney | Yes | Yes |
real, float | Yes | Yes |
bit | Yes | Yes |
char, varchar, nchar, nvarchar | Yes, decoded in the server's character set | Yes, decoded in the server's character set |
text | The table is refused | Yes, decoded in the server's character set |
unichar, univarchar | Yes | Yes |
unitext | The table is refused | Yes |
binary, varbinary | Yes | Yes |
image | The table is refused | Yes |
date, time, smalldatetime, datetime, bigdatetime, bigtime | Yes | Yes |
timestamp | Yes, as its 8-byte binary value | Yes, as its 8-byte binary value |
sysname, longsysname | Yes, as character data | Yes, as character data |
| Identity columns | Yes | Yes |
uniqueidentifier | Not tested | Not tested |
| Computed columns | Not tested | Not tested |
| Encrypted columns | Refused by name before the initial load | Refused by name before the initial load |
| Any other storage type | Refused | Refused |
Notes for Sybase ASE
- Large values. Both modes capture
text,unitextandimagecolumns in full. A value whose page chain is longer than 4,096 pages is refused. - Lock schemes. Both modes capture all-pages, data-pages and data-rows locked tables.
- Character sets. A table with
char,varchar,nchar,nvarcharortextcolumns needs a server character set SQL Flow can decode. See Supported character sets.
Messages you can see:
LOB chain exceeded 4096 pages; refusing to walk a runaway/corrupt chain.Invalid ASE schema metadata for column '<column>' (colid=<n>, declared='<type>', physical=0x<code>): unsupported physical type 0x<code>.ASE server character set '<name>' is unsupported; refusing a replacement encoding.