Skip to content

Commit 0842fee

Browse files
authored
[FLINK-37959][postgres]Supports all pgsql field types like debezium (#4086)
1 parent a0699ac commit 0842fee

File tree

11 files changed

+1623
-208
lines changed

11 files changed

+1623
-208
lines changed

docs/content.zh/docs/connectors/pipeline-connectors/postgres.md

Lines changed: 269 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,6 @@ pipeline:
290290

291291
## 数据类型映射
292292

293-
294293
<div class="wy-table-responsive">
295294
<table class="colwidths-auto docutils">
296295
<thead>
@@ -300,6 +299,17 @@ pipeline:
300299
</tr>
301300
</thead>
302301
<tbody>
302+
<tr>
303+
<td>
304+
BOOLEAN <br>
305+
BIT(1) <br>
306+
<td>BOOLEAN</td>
307+
</tr>
308+
<tr>
309+
<td>
310+
BIT( > 1)
311+
<td>BYTES</td>
312+
</tr>
303313
<tr>
304314
<td>
305315
SMALLINT<br>
@@ -317,79 +327,290 @@ pipeline:
317327
<tr>
318328
<td>
319329
BIGINT<br>
320-
BIGSERIAL</td>
321-
<td>BIGINT</td>
322-
</tr>
323-
<tr>
324-
<td>NUMERIC</td>
325-
<td>DECIMAL(20, 0)</td>
326-
</tr>
327-
<tr>
328-
<td>BIGINT</td>
330+
BIGSERIAL<br>
331+
OID<br>
332+
</td>
329333
<td>BIGINT</td>
330334
</tr>
331335
<tr>
332336
<td>
333337
REAL<br>
334-
FLOAT4</td>
338+
FLOAT4
339+
</td>
335340
<td>FLOAT</td>
336341
</tr>
337-
<tr>
338-
<td>
339-
FLOAT8<br>
340-
DOUBLE PRECISION</td>
341-
<td>DOUBLE</td>
342-
</tr>
343-
<tr>
344-
<td>
345-
NUMERIC(p, s)<br>
346-
DECIMAL(p, s)</td>
347-
<td>DECIMAL(p, s)</td>
342+
<tr>
343+
<td>NUMERIC</td>
344+
<td>DECIMAL(38, 0)</td>
348345
</tr>
349346
<tr>
350-
<td>BOOLEAN</td>
351-
<td>BOOLEAN</td>
347+
<td>DOUBLE PRECISION<br>
348+
FLOAT8
349+
</td>
350+
<td>DOUBLE</td>
352351
</tr>
352+
<tr>
353+
<td> CHAR[(M)]<br>
354+
VARCHAR[(M)]<br>
355+
CHARACTER[(M)]<br>
356+
BPCHAR[(M)]<br>
357+
CHARACTER VARYING[(M)]
358+
</td>
359+
<td>STRING</td>
360+
</tr>
353361
<tr>
354-
<td>DATE</td>
355-
<td>DATE</td>
362+
<td>TIMESTAMPTZ<br>
363+
TIMESTAMP WITH TIME ZONE</td>
364+
<td>ZonedTimestampType</td>
356365
</tr>
357366
<tr>
358-
<td>TIME [(p)] [WITHOUT TIMEZONE]</td>
359-
<td>TIME [(p)] [WITHOUT TIMEZONE]</td>
367+
<td>INTERVAL [P]</td>
368+
<td>BIGINT</td>
360369
</tr>
361370
<tr>
362-
<td>TIMESTAMP [(p)] [WITHOUT TIMEZONE]</td>
363-
<td>TIMESTAMP [(p)] [WITHOUT TIMEZONE]</td>
371+
<td>INTERVAL [P]</td>
372+
<td>STRING(when <code>debezium.interval.handling.mode</code> is set to string)</td>
364373
</tr>
365374
<tr>
366-
<td>
367-
CHAR(n)<br>
368-
CHARACTER(n)<br>
369-
VARCHAR(n)<br>
370-
CHARACTER VARYING(n)</td>
371-
<td>CHAR(n)</td>
375+
<td>BYTEA</td>
376+
<td>BYTES or STRING (when <code>debezium.binary.handling.mode</code> is set to base64 or base64-url-safe or hex)</td>
372377
</tr>
373378
<tr>
374379
<td>
375-
TEXT</td>
380+
JSON<br>
381+
JSONB<br>
382+
XML<br>
383+
UUID<br>
384+
POINT<br>
385+
LTREE<br>
386+
CITEXT<br>
387+
INET<br>
388+
INT4RANGE<br>
389+
INT8RANGE<br>
390+
NUMRANGE<br>
391+
TSRANGE<br>
392+
DATERANGE<br>
393+
ENUM
394+
</td>
376395
<td>STRING</td>
377396
</tr>
378-
<tr>
379-
<td>BYTEA</td>
380-
<td>BYTES</td>
381-
</tr>
382397
</tbody>
383398
</table>
384399
</div>
385400

386-
### 空间数据类型映射
387-
PostgreSQL通过PostGIS扩展支持空间数据类型:
401+
### Temporal types Mapping
402+
除了包含时区信息的 PostgreSQL 的 TIMESTAMPTZ 数据类型之外,其他时间类型如何映射取决于连接器配置属性 <code>debezium.time.precision.mode</code> 的值。以下各节将描述这些映射关系:
403+
- debezium.time.precision.mode=adaptive
404+
- debezium.time.precision.mode=adaptive_time_microseconds
405+
- debezium.time.precision.mode=connect
406+
407+
注意: 受限当前CDC对时间类型的支持,<code>debezium.time.precision.mode</code>为adaptive或adaptive_time_microseconds或connect Time类型都转化为Integer类型,并精度为3,后续将进行完善。
388408

389-
GEOMETRY(POINT, xx):表示使用笛卡尔坐标系的点,EPSG:xxx定义其坐标系统,适用于局部平面计算。
390-
GEOGRAPHY(MULTILINESTRING):以经纬度存储多条线串,基于球面模型,适合全球范围的空间分析。
409+
<u>debezium.time.precision.mode=adaptive</u>
391410

392-
前者用于小范围平面数据,后者用于大范围、需考虑地球曲率的地理数据。
411+
当<code>debezium.time.precision.mode</code>属性设置为默认的 adaptive(自适应)时,连接器会根据列的数据类型定义来确定字面类型和语义类型。这可以确保事件能够精确地表示数据库中的值。
412+
<div class="wy-table-responsive">
413+
<table class="colwidths-auto docutils">
414+
<thead>
415+
<tr>
416+
<th class="text-left">PostgreSQL type<a href="https://www.postgresql.org/docs/12/datatype.html"></a></th>
417+
<th class="text-left">CDC type<a href="{% link dev/table/types.md %}"></a></th>
418+
</tr>
419+
</thead>
420+
<tbody>
421+
<tr>
422+
<td>
423+
DATE
424+
<td>DATE</td>
425+
</tr>
426+
<tr>
427+
<td>
428+
TIME([P])
429+
</td>
430+
<td>INTEGER</td>
431+
</tr>
432+
<tr>
433+
<td>
434+
TIMESTAMP([P])
435+
</td>
436+
<td>TIMESTAMP([P])</td>
437+
</tr>
438+
</tbody>
439+
</table>
440+
</div>
441+
442+
### Decimal types Mapping
443+
PostgreSQL 连接器配置属性 <code>debezium.decimal.handling.mode</code> 的设置决定了连接器如何映射十进制类型。
444+
445+
当 <code>debezium.decimal.handling.mode</code> 属性设置为 precise(精确)时,连接器会对所有 DECIMAL、NUMERIC 和 MONEY 列使用 Kafka Connect 的 org.apache.kafka.connect.data.Decimal 逻辑类型。这是默认模式。
446+
<div class="wy-table-responsive">
447+
<table class="colwidths-auto docutils">
448+
<thead>
449+
<tr>
450+
<th class="text-left">PostgreSQL type<a href="https://www.postgresql.org/docs/12/datatype.html"></a></th>
451+
<th class="text-left">CDC type<a href="{% link dev/table/types.md %}"></a></th>
452+
</tr>
453+
</thead>
454+
<tbody>
455+
<tr>
456+
<td>
457+
NUMERIC[(M[,D])]
458+
<td>DECIMAL[(M[,D])]</td>
459+
</tr>
460+
<tr>
461+
<td>
462+
NUMERIC
463+
<td>DECIMAL(38,0)</td>
464+
</tr>
465+
<tr>
466+
<td>
467+
DECIMAL[(M[,D])]
468+
<td>DECIMAL[(M[,D])]</td>
469+
</tr>
470+
<tr>
471+
<td>
472+
DECIMAL
473+
<td>DECIMAL(38,0)</td>
474+
</tr>
475+
<tr>
476+
<td>
477+
MONEY[(M[,D])]
478+
<td>DECIMAL(38,digits)(schema 参数 scale 包含一个整数,表示小数点移动了多少位。scale schema 参数由 money.fraction.digits 连接器配置属性决定。)</td>
479+
</tr>
480+
</tbody>
481+
</table>
482+
</div>
483+
484+
当 <code>debezium.decimal.handling.mode</code> 属性设置为 double 时,连接器将所有 DECIMAL、NUMERIC 和 MONEY 值表示为 Java 的 double 值,并按照下表所示进行编码。
485+
486+
<div class="wy-table-responsive">
487+
<table class="colwidths-auto docutils">
488+
<thead>
489+
<tr>
490+
<th class="text-left">PostgreSQL type<a href="https://www.postgresql.org/docs/12/datatype.html"></a></th>
491+
<th class="text-left">CDC type<a href="{% link dev/table/types.md %}"></a></th>
492+
</tr>
493+
</thead>
494+
<tbody>
495+
<tr>
496+
<td>
497+
NUMERIC[(M[,D])]
498+
<td>DOUBLE</td>
499+
</tr>
500+
<tr>
501+
<td>
502+
DECIMAL[(M[,D])]
503+
<td>DOUBLE</td>
504+
</tr>
505+
<tr>
506+
<td>
507+
MONEY[(M[,D])]
508+
<td>DOUBLE</td>
509+
</tr>
510+
</tbody>
511+
</table>
512+
</div>
513+
514+
<code>debezium.decimal.handling.mode</code> 配置属性的最后一个可选设置是 string(字符串)。在这种情况下,连接器将 DECIMAL、NUMERIC 和 MONEY 值表示为其格式化的字符串形式,并按照下表所示进行编码。
515+
<div class="wy-table-responsive">
516+
<table class="colwidths-auto docutils">
517+
<thead>
518+
<tr>
519+
<th class="text-left">PostgreSQL type<a href="https://www.postgresql.org/docs/12/datatype.html"></a></th>
520+
<th class="text-left">CDC type<a href="{% link dev/table/types.md %}"></a></th>
521+
</tr>
522+
</thead>
523+
<tbody>
524+
<tr>
525+
<td>
526+
NUMERIC[(M[,D])]
527+
<td>STRING</td>
528+
</tr>
529+
<tr>
530+
<td>
531+
DECIMAL[(M[,D])]
532+
<td>STRING</td>
533+
</tr>
534+
<tr>
535+
<td>
536+
MONEY[(M[,D])]
537+
<td>STRING</td>
538+
</tr>
539+
</tbody>
540+
</table>
541+
</div>
542+
543+
当 <code>debezium.decimal.handling.mode</code> 的设置为 string 或 double 时,PostgreSQL 支持将 NaN(非数字)作为一个特殊值存储在 DECIMAL/NUMERIC 值中。在这种情况下,连接器会将 NaN 编码为 Double.NaN 或字符串常量 NAN。
544+
545+
### HSTORE type Mapping
546+
PostgreSQL 连接器配置属性 <code>debezium.hstore.handling.mode</code> 的设置决定了连接器如何映射 HSTORE 值。
547+
548+
当 <code>debezium.hstore.handling.mode</code> 属性设置为 json(默认值)时,连接器将 HSTORE 值表示为 JSON 值的字符串形式,并按照下表所示进行编码。当 <code>debezium.hstore.handling.mode</code> 属性设置为 map 时,连接器对 HSTORE 值使用 MAP 模式类型。
549+
<div class="wy-table-responsive">
550+
<table class="colwidths-auto docutils">
551+
<thead>
552+
<tr>
553+
<th class="text-left">PostgreSQL type<a href="https://www.postgresql.org/docs/12/datatype.html"></a></th>
554+
<th class="text-left">CDC type<a href="{% link dev/table/types.md %}"></a></th>
555+
</tr>
556+
</thead>
557+
<tbody>
558+
<tr>
559+
<td>
560+
HSTORE
561+
<td>STRING(<code>`debezium.hstore.handling.mode`=`string`</code>)</td>
562+
</tr>
563+
<tr>
564+
<td>
565+
HSTORE
566+
<td>MAP(<code>`debezium.hstore.handling.mode`=`map`</code>)</td>
567+
</tr>
568+
</tbody>
569+
</table>
570+
</div>
571+
572+
### Network address types Mapping
573+
PostgreSQL 拥有可以存储 IPv4、IPv6 和 MAC 地址的数据类型。使用这些类型来存储网络地址比使用纯文本类型更为合适。网络地址类型提供了输入错误检查以及专用的操作符和函数。
574+
<div class="wy-table-responsive">
575+
<table class="colwidths-auto docutils">
576+
<thead>
577+
<tr>
578+
<th class="text-left">PostgreSQL type<a href="https://www.postgresql.org/docs/12/datatype.html"></a></th>
579+
<th class="text-left">CDC type<a href="{% link dev/table/types.md %}"></a></th>
580+
</tr>
581+
</thead>
582+
<tbody>
583+
<tr>
584+
<td>
585+
INET
586+
<td>STRING</td>
587+
</tr>
588+
<tr>
589+
<td>
590+
CIDR
591+
<td>STRING</td>
592+
</tr>
593+
<tr>
594+
<td>
595+
MACADDR
596+
<td>STRING</td>
597+
</tr>
598+
<tr>
599+
<td>
600+
MACADDR8
601+
<td>STRING</td>
602+
</tr>
603+
</tbody>
604+
</table>
605+
</div>
606+
607+
### PostGIS Types Mapping
608+
PostgreSQL 通过 PostGIS 扩展支持空间数据类型:
609+
```
610+
GEOMETRY(POINT, xx): 在笛卡尔坐标系中表示一个点,其中 EPSG:xx 定义了坐标系。它适用于局部平面计算。
611+
GEOGRAPHY(MULTILINESTRING): 在基于球面模型的纬度和经度上存储多条线串。它适用于全球范围的空间分析。
612+
```
613+
前者适用于小范围的平面数据,而后者适用于需要考虑地球曲率的大范围数据。
393614
<div class="wy-table-responsive">
394615
<table class="colwidths-auto docutils">
395616
<thead>
@@ -401,11 +622,11 @@ PostgreSQL通过PostGIS扩展支持空间数据类型:
401622
<tbody>
402623
<tr>
403624
<td>GEOMETRY(POINT, xx)</td>
404-
<td>{"hexewkb":"0101000020730c00001c7c613255de6540787aa52c435c42c0","srid":3187}</td>
625+
<td>{"coordinates":"[[174.9479, -36.7208]]","type":"Point","srid":3187}"</td>
405626
</tr>
406627
<tr>
407628
<td>GEOGRAPHY(MULTILINESTRING)</td>
408-
<td>{"hexewkb":"0105000020e610000001000000010200000002000000a779c7293a2465400b462575025a46c0c66d3480b7fc6440c3d32b65195246c0","srid":4326}</td>
629+
<td>{"coordinates":"[[169.1321, -44.7032],[167.8974, -44.6414]]","type":"MultiLineString","srid":4326}</td>
409630
</tr>
410631
</tbody>
411632
</table>

0 commit comments

Comments
 (0)