Сопоставление типов данных 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 |
ДЕСЯТИЧНОЕ идентично ЦИФРОВОМУ.