4.2. Поддерживаемые типы данных #

Типы в базе данных-источнике преобразуются в типы базы данных-приёмника следующим образом: драйвер источника сопоставляет типам источника типы Go, а затем кодировщики преобразуют данные в двоичный формат, соответствующий приёмнику.

Поддерживаются следующие типы данных Oracle:

NUMBER, CHAR, NCHAR, VARCHAR, NVARCHAR, VARCHAR2, NVARCHAR2, STRING, DATE, LONG, LONG RAW, CLOB, NCLOB, BLOB, BFILE, RAW(16), RAW(32), RAW, ROWID, UROWID, FLOAT, DEC, DECIMAL, DOUBLE PRECISION, INT, INTEGER, BINARY_INTEGER, PLS_INTEGER, SMALLINT, REAL, BINARY_FLOAT, BINARY_DOUBLE, TIMESTAMP, BOOLEAN, INTERVAL, XMLTYPE, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE, VARRAY.

Поддерживаются следующие типы данных PostgreSQL:

BFILE, BOOLEAN, BYTEA, CHAR, CHARACTER VARYING(N), VARCHAR(N), CHARACTER(N), CHAR(N), BPCHAR(N), BPCHAR, DBMS_LOB.BLOB, DBMS_LOB.CLOB, NAME, TEXT, SMALLINT, INTEGER, BIGINT, DECIMAL, NUMERIC, REAL, DOUBLE PRECISION, SMALLSERIAL, SERIAL, BIGSERIAL, TIMESTAMP, DATE, TIME, INTERVAL, HSTORE, UUID, XML, JSON, JSONB, OID, MONEY, CIDR, INET, MACADDR, MACADDR8, tsquery, tsvector, txid_snapshot, pg_snapshot, pg_lsn и пользовательские типы данных.

При переносе данных типа MONEY значение читается из источника без символа денежной единицы, а записывается в приёмник с символом денежной единицы, соответствующей локали приёмника.

Следующая таблица описывает соответствие между типами данных Oracle и PostgreSQL:

Таблица 4.2. Соответствие типов Oracle и PostgreSQL

Тип OracleТип GoТип PostgreSQL
VARCHAR2
NVARCHAR2
CHAR
NCHAR
LONG
string
text
char(n)
varchar(n)
bool
CLOB
NCLOB
string
dbms_lob.clob
text
BINARY_DOUBLEfloat64
real
double precision
smallint
integer
bigint
numeric
smallserial
serial
bigserial
FLOAT
DEC
DECIMAL
NUMBER
Decimalnumeric
BINARY_FLOATfloat32real
DATEtime.Timetimestamp
TIMESTAMP(0)
TIMESTAMP(3)
TIMESTAMP(6)
TIMESTAMP(9)
TIMESTAMP(0) WITH TIME ZONE
TIMESTAMP(3) WITH TIME ZONE
TIMESTAMP(6) WITH TIME ZONE
TIMESTAMP(9) WITH TIME ZONE
time.Timetimestamp [with timezone]
LONG RAW
BLOB
RAW
[]byte
sfile
dbms_lob.blob
bytea
BFILE
model.BFile
{
      alias        string,
      filename string
}
bfile
BOOLEANboolbool
NTERVAL ...
model.Interval
{
    Years        int
    Months       int
    Days         int
    Hours        int
    Minutes      int
    Seconds      int
    Milliseconds int
    Sign         int
}
interval

В следующих таблицах описано соответствие типов данных PostgreSQL типам данных в файлах формата Parquet.

Следующая таблица описывает соответствие числовых типов данных:

Таблица 4.3. Соответствие числовых типов PostgreSQL типам в файлах формата Parquet

Тип PostgreSQLТип в ParquetПример в PostgreSQLПример в ParquetКомментарий
smallintINT3255 
integerINT3255 
bigintINT6455 
numericFIXED_LEN_BYTE_ARRAY-1.2580xFFFFFFFFFFFFFFFF​FFFFFFFFB5047180

Допустимы только точность 38 и масштаб 9.

The physical type is FIXED_LEN_BYTE_ARRAY(16), and the logical type is DECIMAL. The minimum value is -1701411834604692​31731687303715.​884105728, and the maximum value is 1701411834604692​31731687303715.​884105727.

decimalFIXED_LEN_BYTE_ARRAY-1.2580xFFFFFFFFFFFFFFFFF​FFFFFFFB5047180Справедлив комментарий к типу numeric.
realFLOAT129.153129.1529998779297 
double precisionDOUBLE-1.258-1.258 

Следующая таблица описывает соответствие денежных типов данных:

Таблица 4.4. Соответствие денежных типов PostgreSQL типам в файлах формата Parquet

Тип PostgreSQLТип в ParquetПример в PostgreSQLПример в ParquetКомментарий
moneyBYTE_ARRAY$1.251.25Тип сохраняется как строка без символа денежной единицы.

Следующая таблица описывает соответствие строковых типов данных:

Таблица 4.5. Соответствие строковых типов PostgreSQL типам в файлах формата Parquet

Тип PostgreSQLТип в ParquetПример в PostgreSQLПример в ParquetКомментарий
varcharBYTE_ARRAY"test string""test string"В том числе поддерживается varchar(n) с заданной длиной, однако длина не учитывается.
char(10)BYTE_ARRAY"test""test"Если строка короче указанной длины, оставшиеся символы заполняются пробелами.
textBYTE_ARRAY"test string""test string" 

Следующая таблица описывает соответствие типов данных даты и времени:

Таблица 4.6. Соответствие типов даты/времени PostgreSQL типам в файлах формата Parquet

Тип PostgreSQLТип в ParquetПример в PostgreSQLПример в ParquetКомментарий
timestamp without time zoneINT64"2006-01-02 15:04:05"113621424​5000000Поддерживается timestamp(6), но точность игнорируется. Возвращается число микросекунд с начала эпохи UNIX.
timestamp with time zoneINT64"02 Jan 06 15:04 EST"11362322​40000000Часовой пояс и точность игнорируются. Возвращается число микросекунд.
dateBYTE_ARRAY"2006-01-02"2006-01-02Дата сохраняется в виде строки в этом формате. Даты до н.э. (BC) не поддерживаются.
time without time zoneINT64"15:04:05"54245000000Количество микросекунд с начала суток. Поддерживается timestamp(6), но точность игнорируется.
intervalFIXED_LEN_BYTE_ARRAY"1 years 0 mons 2 days 3 hours 20 mins 0.0 secs"1 year 2 days 03:20:00

Физический тип — FIXED_LEN_BYTE_ARRAY(12). По 4 байта отводится на значение месяцев, дней и миллисекунд. Тип реализован в соответствии со спецификацией LogicalTypes.md. Логический и преобразованный тип — INTERVAL.

Имейте в виду, что при этом сопоставлении теряется точность: в то время, как PostgreSQL хранит значения типа interval с точностью до микросекунд, Parquet хранит interval только до миллисекунд.

Для этого типа статистика MinMax не собирается. Если статистика по этому типу всё же доступна, следующий запрос в duckDB приведёт к ошибке:

SELECT * FROM parquet_metadata(./file.parquet)

Следующая таблица описывает соответствие других типов данных:

Таблица 4.7. Соответствие прочих типов PostgreSQL типам в файлах формата Parquet

Тип PostgreSQLТип в ParquetПример в PostgreSQLПример в Parquet
booleanBOOLEANTRUEtrue
byteaBYTE_ARRAY"test bytes""test bytes"

Примечание

В настоящий момент тип Parquet xml не поддерживается.