Співставлення типів даних 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.
|