Поиск

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

MySQL поддерживает все стандартные числовые типы SQL. Эти типы включают в себя точные числовые типы (INTEGER, SMALLINT, DECIMAL и NUMERIC), а также приближен­ные числовые типы (FLOAT, REAL и DOUBLE PRECISION). Ключевое слово INT - это сино­ним ДЛЯ INTEGER, a DEC - СИНОНИМ ДЛЯ DECIMAL.
В качестве расширения стандарта SQL, MySQL также поддерживает целые типы TINYINT, MEDIUMINT и BIGINT, как перечислено в табл.
Таблица Целые типы данных в MySQL

Тип Байт Минимум (знаковое) Максимум (знаковое)
TINYINT 1 -128 127
SMALLINT 2 -32768 32767
MEDIUMINT 3 -8388608 8388607
INT 4 -2147483648 2147483647
BIGINT 8 -9223372036854775808 9223372036854775807

Другое расширение поддерживается MySQL для необязательного указания ширины отображения целого значения в скобках, которое следует за базовым ключевым словом типа (например, INT(4)). Эта спецификация ширины отображения применяется для до­полнения пробелами слева тех чисел, у которых разрядов меньше, чем в ней указано.
Ширина отображения никак не ограничивает ни диапазон допустимых значений столбца, ни количество разрядов для чисел, превышающих указанную ширину.
При использовании совместно с необязательным атрибутом ZEROFILL дополнение пробелами слева заменяется дополнением нулями. Например, для столбца, объявленного как INT(5) ZEROFILL, значение 4 извлекается как 00004. Имейте в виду, что если вы со­храняете значения, количество разрядов в которых больше заданной ширины отображе­ния, то можете столкнуться с проблемами, когда MySQL будет генерировать временные таблицы для некоторых сложных соединений, поскольку в этом случае MySQL предпо­лагает, что данные должны поместиться в отведенную ширину.
Все целые типы могут иметь необязательный (нестандартный) атрибут UNSIGNED (без­знаковое). Беззнаковые значения могут использоваться, когда вы хотите разрешить только неотрицательные значения в столбцах и вам требуется больший верхний предел для них.
Начиная с MySQL 4.0.2, типы с плавающей и фиксированной точкой тоже могут иметь атрибут UNSIGNED. Как и для целых типов, он предотвращает сохранения отрицательных значений в таких столбцах. Однако, в отличие от целых, при этом верхний до­пустимый предел остается неизменным.

Если вы указываете атрибут ZEROFILL для числового столбца, MySQL автоматически добавляет атрибут UNSIGNED.
DECIMAL и NUMERIC в MySQL реализованы как один и тот же тип. Они применяются для хранения значений, которые должны быть точными, например, для денежных вели­чин. Когда объявляется столбец одного из этих типов, ей можно указать (и обычно так и делается) точность (precision) и масштаб (scale). Например:
salary DECIMAL(5,2)
В этом примере 5 — это точность, а 2 — масштаб. Точность представляет количество значащих десятичных разрядов, а масштаб - количество разрядов после десятичной точки.
MySQL сохраняет DECIMAL и NUMERIC в виде строк вместо того, чтобы хранить в виде двоичных чисел с плавающей точкой, для обеспечения исключительной точности этих значений. При этом используется по одному символу для каждого разряда, один сим­вол -для десятичной точки (если масштаб больше 0), и один-для знака '-' (для отрица­тельных значений). Если масштаб равен 0, DECIMAL и NUMERIC не содержат десятичной точки и дробной части.
Стандарт SQL требует, чтобы столбец salary мог хранить любое значение с пятью разрядами и двумя знаками после точки. Поэтому в данном случае диапазон допустимых значений salary составит от-999.99 до 999. 99. MySQL при этом идет двумя путями:

  1. В положительной области диапазона столбец может хранить значения до 999.99. Для положительных чисел MySQL использует зарезервированный для знака байт,
    чтобы учеличить верхний предел диапазона.
  2. До MySQL 3.23 столбцы DECIMAL сохранялись иначе и не могли представлять все значения, которые требовал стандарт SQL. Это было связано с тем, что для типа
    DECIMAL {M, D) значение М включало байты для знака и десятичной точки. Таким образом, диапазон значений salary до MySQL 3.23 составлял от-9.99 до 9.99.

В стандартном SQL синтаксис decimal(m) эквивалентен decimal(M,0). Соответст­венно, синтаксис DECIMAL эквивалентен DECIMAL (М), где М по умолчанию определяется реализацией. Начиная с MySQL 3.23.6, поддерживаются обе формы типов данных DECIMAL и NUMERIC. Значение Afпо умолчанию равно 10. До версии MySQL 3.23.6 значе­ния М и Dдолжны были указываться явно.
Максимальный диапазон значений DECIMAL и NUMERIC такой же как DOUBLE, но факти­ческий диапазон значений конкретного столбца мог быть ограничен точностью и мас­штабом этой столбца. Когда такому столбцу присваивается значение с большим количе­ством десятичных разрядов после точки, чем указано в его спецификации масштаба, значение преобразуется в указанный масштаб. (Приведение точности зависит от опера­ционной системы, но обычно это делается просто отбрасыванием лишних разрядов.) Когда в столбец DECIMAL и NUMERIC записывается значение, выходящее за допустимый диапазон, он принимает граничное значение допустимого диапазона.
Для типов столбцов с плавающей точкой MySQL использует четыре байта для значе­ний одинарной точности и восемь для значений двойной точности.
Тип FLOAT применяется для представления приближенных числовых типов данных. Стандарт SQL позволяет указывать необяхательную спецификацию точности (но не диапа­зон экспоненты) в битах в скобках, следом за ключевым словом FLOAT. Реализация MySQL также поддерживает эту спецификацию точности, но значение точности используется толь­ко для указания хранимого размера. Точность от 0 до 23 обеспечивает тип столбца FLOAT одинарной точности. Точность от 24 до 53 - тип столбца DOUBLE двойной точности.

Когда ключевое слово FLOAT используется для типа столбца без спецификации точ­ности, MySQL использует четыре байта для хранения значений. MySQL также поддер­живает синтаксис с двумя числами, указанными в скобках после слова FLOAT. При этом первое число указывает отображаемую ширину, а второе - количество разрядов после десятичной точки, которое должно сохраняться и отображаться (так же, как у DECIMAL и NUMERIC). Когда MySQL требуется в данной столбцу сохранить число с большим количе­ством разрядов после точки, чем указано в спецификации этой столбца, при сохранении значение округляется для исключения лишних разрядов.
В стандарте SQL типы REAL и DOUBLE PRECISION не допускают спецификаций точно­сти. MySQL поддерживает вариацию синтаксиса с двумя числами в скобках следом за именем типа. Первое число представляет отображаемую ширину, а второе - количество разрядов после точки, которые должны сохраняться и отображаться. В качестве расшире­ния стандарта SQL, MySQL распознает DOUBLE как синоним типа DOUBLE PRECISION. По контрасту с требованиями стандарта, что точность REAL должна быть меньше, чем DOUBLE PRECISION, MySQL реализует оба эти типа, как восьмибайтное число с плавающей точкой двойной точности (если только SQL-режим сервера не включает опцию REAL_AS_FLOAT).
Для достижения максимальной переносимости код, требующий сохранения прибли­женных числовых значений, должен использовать FLOAT и double precision без указа­ния точности или количества разрядов после точки.
Когда в столбец записывается значение, выходящее за диапазон допустимых для данного типа, он принимает и сохраняет граничное значение допустимого диапазона.
Например, диапазон значений для столбцов типа INT составляет от -2147483648 до 2147483647. Если вы попытаетесь вставить значение -9999999999 в столбец типа INT, MySQL усечет его до нижней границы диапазона и сохранит -2147483648. Точно так же, если попытаться записать в этот столбец значение 9999999999, сохранено будет 2147483647.
Если столбец INT имеет атрибут UNSIGNED, размер диапазона значений такой же, но его границы смещаются к 0 и 4294967295. Если попытаться записать -9999999999 и 9999999999 B ЭТОТ столбец, будут сохранены значения 0 и 4294967295 соответственно.
О преобразовании, выполняемом при таком усечении значений, сообщается в виде предупреждений для операторов ALTER TABLE, LOAD DATA INFILE и многострочных опе­раторов INSERT.