Співставлення типів даних Oracle з PostgreSQL

Одне з найперших і найпоширеніших питань у процесі міграції бази даних з Oracle на PostgreSQL - «Як типи даних Oracle можна порівняти з типами PostgreSQL?».

Проста відповідь полягає в тому, що вони дуже сумісні і легко співставляються. У наведеній нижче таблиці показано порівняння і зіставлення типів даних Oracle з PostgreSQL для найбільш поширених типів Oracle. Ці базові типи даних лише поверхнево демонструють те, що може зробити PostgreSQL, - вона має дуже багату систему типів і підтримує налаштовувані типи. До складу вбудованих типів входять JSON, масиви, UUID, IP-адреси, геометричні типи, перерахування та багато іншого.

Тип даних Oracle

Тип даних PostgreSQL

Коментарі

Char()

Char()

 

Char(1)

Char(1)

Якщо використовується як бульовий прапор, краще використовувати тип даних boolean

Varchar2()

Varchar()

 

Timestamp

Timestamptz

Взагалі, ми рекомендуємо зберігати timestamp як timestamp з часовим поясом (timestamptz), що еквівалентно timestamp Oracle з місцевим часовим поясом. Таким чином зберігаються всі значення в UTC, навіть якщо сервер або клієнт бази даних знаходяться в різних часових поясах, що дозволяє уникнути безлічі проблем. Але, можливо, якийсь код програми повинен використовувати типи, що мають інформацію про часовий пояс - якщо це важливий момент, використовуйте timestamp без часового поясу, щоб мінімізувати зміни міграції.

Date

Timestamptz

Тип PostgreSQL зберігає лише дату і не зберігає часу

Date

Date

 

Number()

Numeric()

PostgreSQL Numeric схожий на Oracle Number зі змінною діапазоном і точністю, тому може використовуватися для будь-яких числових полів, але іноді більш кращі цілочисельні поля і числа з плаваючою комою.

Number(5,0)

Integer

Integer і Bigint працюють краще, ніж Number (), коли використовуються для joinів великих таблиць, тому краще співставлення з Int для полів первинного і зовнішнього ключів, які зазвичай використовуються для joinів.

Number(10,0)

Bigint

 

Number( ,2)

Numeric( ,2)

PostgreSQL Numeric (, 2) ідеально підходить для грошових типів, оскільки він володіє конкретною точністю (якщо ви не маєте справу з єною і не потребуєте типу (, 0)). Тип «money» еквівалентний типу numeric за точністю, але іноді викликає несподіванки для додатків через неявні припущення про форматування. Ніколи не використовуйте представлення з плаваючою комою (float/double) через потенційне заокруглення під час арифметики.

CLOB

Text

Text набагато простіше у використанні, без функцій LOB, просто розглядайте його як символьне поле. Може зберігати до 1 ГБ тексту.

Long

Text

 

BLOB

Bytea

 

Long raw

   

Raw

   

XMLTYPE

XML

 

UROWID

OID

Використання OID в Postgres не еквівалентно і не забезпечує таку ж перевагу в продуктивності, що і ROWID, що використовується в Oracle.