Причина использования DECIMAL (31,0) - PullRequest
5 голосов
/ 15 декабря 2009

Какова причина того, что некоторые люди из происхождения Oracle используют DECIMAL (31,0) для целых чисел. В MySQL это не эффективно.

1 Ответ

4 голосов
/ 15 декабря 2009

Oracle реализует тип данных ANSI "INTEGER" как синоним NUMBER (38)

Подробнее см. " Изучение Oracle: типы данных для SQL и PL / SQL, числа "

Однако следующую таблицу следует использовать как отображение типа данных в Oracle и MySQL:

«Дополнительная информация для разработчиков Oracle® Database SQL для миграций MySQL»

Сравнение Oracle и MySQL> Типы данных> Сравнение типов данных

Основное отличие, как объяснено здесь и здесь , заключается в том, что тип данных Oracle NUMBER имеет формат переменной длины, тогда как тип данных MySQL DECIMAL (n) был represented as strings that require one byte per digit or sign character (до версии 5.0.3)

(тип данных Oracle NUMBER) Внутренний числовой формат

База данных Oracle хранит числовые данные в формат переменной длины. Каждое значение хранится в научной записи, с 1 байт используется для хранения показателя степени и выше до 20 байт для хранения мантиссы. результирующее значение ограничено 38 цифры точности. База данных Oracle не хранит ведущие и конечные нули. Например, число 412 хранится в формате, аналогичном 4,12 х 102, 1 байт используется для хранения показатель степени (2) и 2 байта, используемые для хранения три значащие цифры мантиссы (4,1,2). Отрицательные числа включите знак в их длину.

Учитывая это, столбец размер в байтах для определенного числа значение данных NUMBER (p), где p - это точность заданного значения, может быть рассчитывается с использованием следующего формула:

ROUND((length(p)+s)/2))+1

где s равно нулю, если число положительное, и s равно 1, если число отрицательно.

Ноль и положительный и отрицательный бесконечность (генерируется только при импорте из базы данных Oracle, версия 5) хранится с использованием уникальных представлений. Ноль и минус бесконечность каждый требуется 1 байт; положительная бесконечность требуется 2 байта.

и

(MySQL) DECIMAL Изменения типов данных

Требования к хранилищу для целые и дробные части каждого стоимость определяется отдельно. каждый кратно девяти цифрам требуется четыре байтов и оставшихся цифр более требуется некоторая доля четырех байт. [...]

Например, столбец DECIMAL (18,9) имеет девять цифр по обе стороны от десятичная точка, так что целая часть и дробная часть каждого требует четыре байт. ДЕСЯТИЧНЫЙ (20,6) столбец имеет четырнадцать целых цифр и шесть дробные цифры. Целые цифры требуется четыре байта для девяти из цифры и три байта для оставшиеся пять цифр. Шесть дробные цифры требуют три байта.

...