Навигация

Поиск по Сайту

Партнеры

Самоучитель. Книги.

Статистика

    Каталог@Mail.ru - каталог ресурсов интернет

Числовые типы в MySQL

Главная Страница » Книги по PHP » MySQL уроки для начинающих с нуля » Числовые типы в MySQL

MySQL поддерживает все числовые типы ANSI SQL92. Эти типы включают точные числовые типы данных (NUMERIC, DECIMAL, INTEGER и SMALLINT), а также приблизительные числовые типы данных (FLOAT, REAL и DOUBLE PRECISION). Ключевое слово INT представляет собой синоним для INTEGER, а ключевое слово DEC является синонимом для DECIMAL.

Типы NUMERIC и DECIMAL выполнены как тот же самый тип MySQL, так разрешено стандартом SQL92. Они используются для значений, для которых важно сохранить идеальную точность, например для работы с финансовыми данными. При объявлении столбца одного из этих типов точность и масштаб могут быть (и обычно бывают) определены, например:


salary DECIMAL(9,2)

В этом примере 9 (точность, precision) представляет число значащих десятичных цифр, которые будут сохранены для значений, а 2 (масштаб, scale) представляет число цифр, которые будут сохранены после десятичной отметки. В этом случае, следовательно, диапазон значений, которые могут быть сохранены в столбце salary, - от -9999999.99 до 9999999.99 (MySQL может фактически сохранять числа до 9999999.99 в этом столбце, потому что не требуется сохранять знак для положительных чисел).

В ANSI SQL92 синтаксис DECIMAL(p) эквивалентен DECIMAL(p,0). Точно так же синтаксис DECIMAL является эквивалентным DECIMAL(p,0), где реализации позволяют менять значение p. MySQL в настоящее время не поддерживает ни одну из этих различных форм типов данных DECIMAL/NUMERIC. Однако серьезной проблемы здесь нет, поскольку принципиальные выгоды этих типов происходят от способности управлять точностью и масштабом явно.

Значения типов DECIMAL и NUMERIC сохранены как строки, а не как двоичные числа с плавающей запятой, чтобы сохранить десятичную точность значений. Один символ используется для каждой цифры значения, десятичной отметки (если scale > 0) и знака минус (для отрицательных чисел). Если scale равен 0, значения DECIMAL и NUMERIC не содержат никакой десятичной отметки или дробной части.

Максимальный диапазон значений DECIMAL и NUMERIC аналогичен диапазону для DOUBLE, но фактический диапазон для данного столбца DECIMAL или NUMERIC может быть ограничен точностью или масштабом для данного столбца. Когда такой столбец назначен, значение с большим количеством цифр после десятичной отметки, чем позволяет определенный масштаб, будет округлено до заданного масштаба. Когда происходит переполнение (столбцу присваивается значение, превышающее его диапазон), MySQL сохраняет значение, представляющее соответствующий максимум этого диапазона.

MySQL поддерживает как расширение стандарта ANSI SQL92 встроенные типы TINYINT, MEDIUMINT и BIGINT, как перечислено выше. Другое расширение реализовано MySQL для факультативного определения ширины отображения значения в круглых скобках после основного ключевого слова для типа (например, INT(4)).

Эта факультативная спецификация ширины используется для вывода значений, ширина которых меньше, чем ширина, определенная для столбца, но не сдерживает диапазон значений, которые могут быть сохранены в столбце, или число цифр, которые будут отображаться для значений, чья ширина превышает заданную.

Когда указание ширины используется вместе с факультативным атрибутом ZEROFILL (заполнить нулями), дополнение значения по умолчанию пробелами будет заменено на нули.

Например, для столбца, объявленного как INT(5) ZEROFILL, значение 4 превратится в 00004, 36 представляется как 00036, а 12345 как 12345 без всяких дополнений.

Обратите внимание, что, если вы сохраняете значения большие, чем ширина отображения в целочисленном столбце, у вас могут возникнуть проблемы, когда MySQL генерирует временные таблицы для некоторых сложных объединений, поскольку в этих случаях MySQL «полагает», что данные вписывались в первоначальную ширину столбца.

Все встроенные типы могут иметь факультативный атрибут UNSIGNED (без знака). Значения без знака могут использоваться, когда вы хотите позволить применение только положительных чисел в столбце, и нуждаетесь в несколько большем числовом диапазоне столбца.

Тип FLOAT используется, чтобы представить приблизительные числовые типы данных. Стандарт ANSI SQL92 позволяет факультативную спецификацию точности (но не диапазон) в битах после ключевого слова FLOAT в круглых скобках. MySQL-реализация также поддерживает эту факультативную спецификацию точности. Когда ключевое слово FLOAT используется для типа столбца без спецификации точности, MySQL применяет четыре байта, чтобы сохранить значения.

Также допустим синтаксис с двумя числами, заданными в круглых скобках, после ключевого слова FLOAT. В этой ситуации первое число продолжает представлять требования к памяти для значения в байтах, а второе определяет число цифр, которые будут сохранены и отобразятся после десятичной отметки (как с DECIMAL и NUMERIC). Когда MySQL нужно сохранить число для такого столбца с большим количеством цифр после десятичной отметки, чем определено для столбца, значение будет автоматически округлено, чтобы устранить лишние цифры. Имейте в виду ошибки округления!

Типы REAL и DOUBLE PRECISION не принимают спецификации точности. В качестве дополнения к стандарту ANSI SQL92 MySQL распознает DOUBLE как синоним для DOUBLE PRECISION. В отличие от требования стандарта, MySQL реализует то и другое как 8-байтные значения двойной точности с плавающей точкой. Это сделано для того, чтобы точность для REAL была меньше, чем используемая для DOUBLE PRECISION.

Когда нужно сохранить в числовом столбце значение, которое выходит за диапазон, MySQL усекает значение до соответствующей границы диапазона и сохраняет возникающее в результате значение.

Например, диапазон столбца INT от -2147483648 до 2147483647. Если вы пробуете вставлять число -9999999999 в столбец типа INT, значение будет усечено до нижней границы диапазона и сохранено -2147483648. Точно так же, если вы пробуете вставить 9999999999, вместо этого будет сохранено только 2147483647.

Если столбец INT определен как UNSIGNED, размер диапазона столбца тот же самый, но произойдет сдвиг значений на 0 и 4294967295. Если вы пробуете сохранять -9999999999 и 9999999999, значения, сохраненные в столбце, станут соответственно 0 и 4294967296.

Преобразования, которые происходят из-за усечения, сообщаются как warning для инструкций LOAD DATA INFILE, UPDATE и многострочного варианта INSERT (более подробно эти инструкции рассматриваются позднее, а пока запомните, что при их выполнении можно увидеть слово warning с пояснениями).