Что на самом деле означает число в скобках?

Я всегда думал, что число в скобках представляет собой длину поля?

Однако я понимаю, что это не всегда так. Может быть, это проблема MySQL? Кто-то сказал мне, что если я установлю поле длиной 9 символов, я могу добавить значение, превышающее 9 символов, но будут сохранены только первые 9.

Пример:

CREATE TABLE `person` (
    id INT,
    age INT(2)
);

Если это так, не должен ли я выбрать что-то вроде TINYINT вместо INT для возраста?


person sdot257    schedule 29.10.2010    source источник


Ответы (2)


INT(2) создаст INT с минимальной шириной отображения 2:

MySQL поддерживает расширение для необязательного указания ширины отображения целочисленных типов данных в круглых скобках после базового ключевого слова для типа. Например, INT(4) задает INT с шириной отображения в четыре цифры. Эта необязательная ширина отображения может использоваться приложениями для отображения целочисленных значений, имеющих ширину меньше, чем ширина, указанная для столбца, путем заполнения их слева пробелами. (То есть эта ширина присутствует в метаданных, возвращаемых с наборами результатов. Используется она или нет, зависит от приложения.)

Ширина отображения не ограничивает диапазон значений, которые могут храниться в столбце. Это также не препятствует правильному отображению значений, превышающих ширину отображения столбца. Например, столбец, указанный как SMALLINT(3), имеет обычный диапазон SMALLINT от -32768 до 32767, а значения за пределами диапазона, разрешенного тремя цифрами, отображаются полностью, используя более трех цифр.

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

Беззнаковое TINYINT (0...255), вероятно, подойдет, если только криоконсервация не требует больших затрат. шаг вперед в течение срока службы вашего приложения.

person Pekka    schedule 29.10.2010
comment
И это продолжается: ширина дисплея не ограничивает диапазон значений, которые могут быть сохранены в столбце. Это также не препятствует правильному отображению значений, превышающих ширину отображения столбца. - person Anders Fjeldstad; 30.10.2010
comment
так зачем подразумевать, что поле может принимать значение до 2? Я не думаю, что это как-то связано с длиной значения для внутреннего mysql, верно? Это просто демонстрация. - person sdot257; 30.10.2010
comment
@ Андерс, это проблема mysql или она применима к postgres, oracle и другим? - person sdot257; 30.10.2010
comment
@lucky, это всего лишь отображение, и более того, похоже, это не более чем рекомендация для приложений. Исключением является использование ZEROFILL, в этом случае значение будет дополнено: 1 => 01... - person Pekka; 30.10.2010
comment
@Anders Я добавил второй абзац для ясности - person Pekka; 30.10.2010
comment
для vchar name(10) означает отображение до 10 символов, я полагаю, я могу уместить более 10 символов? - person sdot257; 30.10.2010
comment
@luckytaxi нет, для varchar это фактическая максимальная ширина, которую может принимать значение. - person Pekka; 30.10.2010
comment
хорошо, все это время я использовал INT. tinyint было бы достаточно для многих моих полей. Спасибо за разъяснение. - person sdot257; 30.10.2010
comment
@Pekka Ваша ссылка сгнила. Страница по-прежнему существует, но больше не содержит слов «минимум», «дисплей» или «ширина». Похоже, они переместили его в Обзор< /а> страница. Я бы предложил отредактировать, но я не уверен, что делать с исходным текстом, который вы процитировали. Мне кажется, стоит сохранить. - person Patrick M; 16.07.2014
comment
Я все еще не понимаю. int(11) — целочисленное значение, какое это имеет отношение к заполнению? Я думал, что отступы предназначены для типа символов. В официальном документе говорится, что int(4) zerofill вернет значение 5 как «0005». Но int - целочисленное значение, как оно может иметь отступ 0? - person Scott Chu; 17.05.2017
comment
@ScottChu хранится внутри как целочисленное значение, но выводится с ведущими нулями. - person Pekka; 17.05.2017

Это относится к типам полей, таким как vchar, но для чисел он представляет количество байтов, которые он использует для представления числа. Целое число из двух байтов означает, что вы можете хранить число 2 ^ 16 - 1 (8 бит в байте, всего 16). Если дело в возрасте, я полагаю, вы должны быть в безопасности с двумя байтами. ;)

person Neil    schedule 29.10.2010
comment
Раньше я думал, что (2) тоже означает байты, но это неверно. - person Pekka; 30.10.2010
comment
ну ладно, так это больше для вчара. Поэтому, если бы я хотел отобразить SSN, мне не нужно было делать ssn INT(9) - person sdot257; 30.10.2010
comment
Видимо я ошибся. Послушайте Пекку. о.О - person Neil; 30.10.2010