Сопоставление типов данных Oracle с PostgreSQL / Хабр
the_unbridled_gooseВремя на прочтение 2 мин
Количество просмотров23K
Oracle *PostgreSQL *
Перевод
Автор оригинала: David Rader
Один из самых первых и распространенных вопросов в процессе миграции базы данных с Oracle на PostgreSQL — «Как типы данных Oracle сопоставимы с типами PostgreSQL?».
Простой ответ заключается в том, что они очень совместимы и легко сопоставляются. В приведенной ниже таблице показано сравнение и сопоставление типов данных Oracle с PostgreSQL для наиболее распространенных типов Oracle. Эти базовые типы данных лишь поверхностно демонстрируют то, что может сделать PostgreSQL, — она имеет очень богатую систему типов и поддерживает настраиваемые типы.
| Тип данных 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 | 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. |
Теги:
- comparison
- data type
- oracle
- postgresql
Хабы:
- Oracle
- PostgreSQL
EDB Docs — EDB Postgres Advanced Server v15
Числовые типы состоят из четырехбайтовых целых чисел, четырехбайтовых и восьмибайтовых чисел с плавающей запятой и десятичных дробей фиксированной точности.
В следующей таблице перечислены доступные типы.
Целочисленные типы
Типы BINARY_INTEGER , INTEGER , PLS_INTEGER и ROWID хранят целые числа (без дробных частей), как указано в таблице числовых типов. Попытки сохранить значения за пределами допустимого диапазона приводят к ошибке.
Числа произвольной точности
Тип ЧИСЛО может хранить почти неограниченное количество цифр точности и точно выполнять вычисления. Мы особенно рекомендуем его для хранения денежных сумм и других величин, где требуется точность. Однако тип NUMBER очень медленный по сравнению с типами с плавающей запятой, описанными в разделе Типы с плавающей запятой.
Шкала числа ЧИСЛО — это количество десятичных цифр в дробной части справа от запятой. точность числа ЧИСЛО — это общее количество значащих цифр в целом числе, то есть количество цифр по обе стороны от десятичной точки.
Таким образом, число 23,5141 имеет точность 6 и масштаб 4. Целые числа имеют нулевой масштаб.
Можно настроить как точность, так и масштаб типа ЧИСЛО . Чтобы объявить столбец типа ЧИСЛО , используйте синтаксис:
ЧИСЛО(точность, масштаб)
Точность должна быть положительной, а масштаб должен быть нулевым или положительным. В качестве альтернативы этот синтаксис выбирает масштаб 0:
ЧИСЛО(точность)
Указание ЧИСЛО без какой-либо точности или масштаба создает столбец, в котором можно хранить числовые значения любой точности и масштаба, вплоть до предела точности реализации. Столбец такого типа не приводит входные значения к какой-либо конкретной шкале, тогда как NUMBER столбцов с объявленной шкалой приводят входные значения к этой шкале. (Стандарт SQL требует масштаба по умолчанию, равного 0, то есть приведения к целочисленной точности. Для максимальной переносимости лучше указать точность и масштаб явно.
)
Если точность или масштаб значения больше заявленной точности или масштаба столбца, система пытается округлить значение. Если значение невозможно округлить до заявленных пределов, возникает ошибка.
Типы с плавающей запятой
Типы данных REAL и DOUBLE PRECISION являются неточными числовыми типами переменной точности. На практике эти типы обычно являются реализациями стандарта IEEE 754 для двоичных арифметических операций с плавающей запятой (одинарной и двойной точности соответственно) в той мере, в какой это поддерживают базовый процессор, операционная система и компилятор.
Неточное значение означает, что некоторые значения не могут быть точно преобразованы во внутренний формат и сохраняются как приблизительные значения, поэтому сохранение и распечатка значения могут показать небольшие расхождения. Управление этими ошибками и то, как они распространяются при вычислениях, является предметом целой области математики и компьютерных наук и далее здесь не обсуждается, за исключением следующих пунктов:
Если вам требуется точное хранение и вычисления (например, денежные суммы), используйте 9Вместо этого введите НОМЕР 0007 .

Если вы хотите выполнять сложные вычисления с этими типами для чего-то важного, особенно если вы полагаетесь на определенное поведение в граничных случаях (бесконечность, потеря значимости), внимательно оцените реализацию.
Сравнение двух значений с плавающей запятой на равенство может работать не так, как ожидалось.
На большинстве платформ тип REAL имеет диапазон не менее 1E-37 от до 1E+37 с точностью не менее шести знаков после запятой. Тип DOUBLE PRECISION обычно имеет диапазон от 1E-307 до 1E+308 с точностью не менее 15 цифр. Слишком большие или слишком маленькие значения вызывают ошибку. Округление может произойти, если точность входного числа слишком высока. Слишком близкие к нулю числа, которые вы не можете представить как отличные от нуля, вызывают ошибку потери значимости.
EDB Postgres Advanced Server также поддерживает стандартные нотации SQL FLOAT и FLOAT(p) для указания неточных числовых типов.
Здесь p указывает минимально допустимую точность двоичных цифр. EDB Postgres Advanced Server принимает значения от FLOAT(1) до FLOAT(24) при выборе типа REAL и от FLOAT(25) до FLOAT(53) при выборе DOUBLE PRECISION . Значения p вне допустимого диапазона рисуют ошибку. FLOAT без указания точности означает ДВОЙНАЯ ТОЧНОСТЬ .
- На этой странице
- Целочисленные типы
- Числа произвольной точности
- Типы с плавающей запятой
Типы данных PostgreSQL — NUMERIC и DECIMAL [Ispirer Migration Knowledge Base]
1
1 Версии : PostgreSQL 8.x и 7.x
| PostgreSQL — ЦИФРОВОЙ | |
|---|---|
| Синтаксис | ЦИФРОВОЙ [ ( п[с] ) ] |
| Данные | Числовые данные с фиксированной точкой |
| Параметры | p — максимальное количество всех цифр (обе стороны от запятой), s — максимальное количество цифр после запятой |
| Диапазон | -10 38 до 10 38 -1, 1 ⇐ p ⇐ 1000, 0 ⇐ s ⇐ p |
| По умолчанию | р — 1000, с — 0 |
| Обработка ошибок | Если масштаб значения больше заявленного масштаба, он округляется до указанного количества дробных цифр |
| Специальные значения | Разрешено специальное значение без учета регистра ‘NaN’ (не число) |
| Стандарты | ANSI SQL |
ДЕСЯТИЧНОЕ идентично ЦИФРОВОМУ.
Тип «money» эквивалентен типу numeric по точности, но иногда вызывает неожиданности для приложений из-за неявных предположений о форматировании. Никогда не используйте представление с плавающей запятой (float / double) из-за потенциального округления во время арифметики.