Каков размер столбца int (11) в mysql в байтах?

488

Каков размер столбца int(11)в mysql в байтах?

А максимальное значение, которое можно хранить в этих столбцах?

Gaurav
источник
1
Возможный дубликат Каков размер SQL Int (N)?
cellepo
1
@cellepo один является общим sql, другой специфичен для mysql (плюс этот имеет гораздо больше просмотров). Если вы хотите пойти на двойную охоту и заставить меня быстро закрыть их одним голосом, посетите чат SOBotics и пингуйте меня. Но тот, кого нужно закрыть, должен быть помечен mysqlдо моего приезда. Thx
Дрю
6
Эй, ребята. Возможно, это дубликат, но он более удобен для поиска. Большинство людей делают поиск таким образом, используя int (11). и это решение вопросов других людей. Вы можете проверить его количество просмотров по сравнению с другим. и пользователь найдет более подробный ответ здесь.
Гаурав

Ответы:

685

Значение INTвсегда будет 4 байта независимо от того, какая длина указана.

  • TINYINT = 1 байт (8 бит)
  • SMALLINT = 2 байта (16 бит)
  • MEDIUMINT = 3 байта (24 бита)
  • INT = 4 байта (32 бита)
  • BIGINT = 8 байт (64 бита).

Длина просто указывает, сколько символов нужно дополнить при выборе данных с помощью клиента командной строки mysql. 12345, сохраненное как int(3), по-прежнему будет отображаться как 12345, но если оно будет сохранено, int(10)оно будет отображаться как 12345, но у вас будет возможность дополнить первые пять цифр. Например, если вы добавили, ZEROFILLон будет отображаться как 0000012345.

... и максимальное значение будет 2147483647 (без подписи) или 4294967295 (без подписи)

Мэтт Маклин
источник
111
тогда что означает значение 11 в int (11) здесь.
Гаурав
73
Столбец INT (4), целое число 1 будет отображаться ТОЛЬКО как 0001, если столбец также был указан как нулевое заполнение. В противном случае он будет отображаться как номер 1 без дополнительных цифр. @Gaurav - не смешивайте, как mysql отображает данные и как они их хранят, это две разные вещи. То, что вы видите, не то, чем оно может быть на самом деле.
Michael JV
13
@ Майкл Вау, действительно интересно. Таким образом, если вы создадите столбец INT (3) и сохраните значение 5001, он сохранит 5001, но отобразит только 1. Я этого не знал.
andrewtweber
16
@andrewtweber: 5001будет отображаться так, как 5001будто поле определено как INT(3). Смотрите ответ @priyabagus ниже и здесь .
go2null
10
Если вы не предоставите длину для целочисленных полей, MySQL установит значение по умолчанию (tinyint 4, smallint 6, mediumint 9, int 11, bigint 20). Стоит отметить, что этих значений по умолчанию достаточно для отображения любого числа, которое может храниться в этом поле (например, максимальное значение smallint равно 2 ^ 16 = 65536, 5 цифр). Если у вас нет веских причин поступить иначе, я бы рекомендовал оставить размеры по умолчанию, чтобы избежать неприятных сюрпризов.
Тибо
167

INT ( x ) будет иметь значение только с точки зрения отображения , то есть показывать число в x разрядах, а не ограничиваться 11. Вы соединяете его, используя ZEROFILL, что будет добавлять нули до тех пор, пока оно не будет соответствовать вашей длине.

Итак, для любого числа х вINT(x)

  • если сохраненное значение имеет меньше цифр, чем x , ZEROFILLбудет добавляться ноль.

    INT (5) ZEROFILL с сохраненным значением 32 покажет 00032
    INT (5) с сохраненным значением 32 покажет 32
    INT с сохраненным значением 32 покажет 32

  • если сохраненное значение имеет больше цифр, чем x , оно будет показано как есть.

    INT (3) ZEROFILL с сохраненным значением 250000 покажет 250000
    INT (3) с сохраненным значением 250000 покажет 250000
    INT с сохраненным значением 250000 покажет 250000

Фактическое значение, хранящееся в базе данных, не изменяется, размер остается тем же, и любые вычисления будут вести себя нормально.

Это также относится к BIGINT, MEDIUMINT, SMALLINT и TINYINT.

priyabagus
источник
49
Таким образом, длина абсолютно ничего не делает, если вы не используете zerofill?
developerbmw
29
@developerbmw - Правильно. Длина абсолютно ничего не делает, если вы не используете ZEROFILL.
Рик Джеймс
ZEROFILL - это режим совместимости с мэйнфреймами.
Хенк Поли
114

Согласно здесь , int(11)потребуется 4 байта пространства, что составляет 32 бита пространства с 2^(31) = 2147483648максимальным значением и -2147483648минимальным значением. Один бит для знака.

Сантош Линкха
источник
1
В вашем примере 9 девяток. Можете ли вы подтвердить, что ваш пример правильный? Если это так, почему он говорит, что 10, когда есть 9 девяток? Количество цифр плюс один плюс знак?
Homer6
5
Нет, максимальное число равно 4294967295, если без знака int, то есть 2 ^ 32. Число в скобках не влияет на тип хранилища. Если вам нужно больше 2 ^ 32, вам нужно перейти на bigint.
Киран Талли
7
Вернее, (2 ^ 32) -1.
Киран Талли
2
+ Киран прав. Максимальное число отличается от указанного в ответе. Смотрите здесь
daviewales
38

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

Многие из этих ответов говорят, что (11)часть влияет только на ширину экрана, что не совсем верно, но в основном.

Определение int(2)с не ZEROFILL указанного будет:

  • по-прежнему принимать значение 100
  • по-прежнему отображать значение, 100когда вывод (не 0или 00)
  • ширина дисплея будет ширина наибольшего значения выводится из запроса на выборку.

Единственное, что нужно (2)будет сделать, это указать также zerofill :

  • значение 1будет показано 01.
  • При отображении значений столбец всегда будет иметь ширину максимально возможного значения, которое может принять столбец, что составляет 10 цифр для целого числа, вместо минимальной ширины, необходимой для отображения наибольшего значения, которое должен отображать столбец в этом конкретном запросе выбора. , который может быть намного меньше.
  • Столбец все еще может принимать и показывать значение, превышающее длину, но эти значения не будут иметь префикс 0.

Лучший способ увидеть все нюансы - запустить:

CREATE TABLE `mytable` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `int1` int(10) NOT NULL,
    `int2` int(3) NOT NULL,
    `zf1` int(10) ZEROFILL NOT NULL,
    `zf2` int(3) ZEROFILL NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `mytable` 
(`int1`, `int2`, `zf1`, `zf2`) 
VALUES
(10000, 10000, 10000, 10000),
(100, 100, 100, 100);

select * from mytable;

который выведет:

+----+-------+-------+------------+-------+
| id | int1  | int2  | zf1        | zf2   |
+----+-------+-------+------------+-------+
|  1 | 10000 | 10000 | 0000010000 | 10000 |
|  2 |   100 |   100 | 0000000100 |   100 |
+----+-------+-------+------------+-------+

Этот ответ проверен на MySQL 5.7.12 для Linux и может отличаться или не изменяться для других реализаций.

Programster
источник
5
«Обратите внимание, что столбец int1 имеет гораздо меньшую ширину экрана, чем zerofill2, даже если длина больше» ... Э-э, это только потому, что имя столбца «zerofill2» имеет длину 9 символов, а «int1» равно 4.
neokio
2
... да, ясно, что длина не влияет, даже на ширину дисплея, когда нулевое заполнение не включено. В противном случае int1 будет намного шире с шириной 10 символов.
Programster
2
Хорошее объяснение с солидным примером. Гораздо лучший ответ, чем принятый. Спасибо @Programster.
Корин
Незначительная гнида: как указывает Неокио, из этого запроса нельзя наблюдать точные последствия "int (3)" с нулевым заполнением. Сократите имя столбца до «zf2», чтобы сделать поведение более понятным. В частности, true или false [для данной версии БД], что "(с нулевым заполнением) При отображении значений столбец всегда будет иметь ширину максимально возможного значения, которое может принимать столбец, что составляет 10 цифр для целого числа",
ToolmakerSteve
1
Чтобы прояснить комментарий neokio и мой незначительный комментарий: предложение «Обратите внимание, что столбец int1 имеет гораздо меньшую ширину отображения, чем zerofill2, даже если длина больше». должны быть удалены из ответа. Это является следствием количества символов в заголовке слова «zerofill2» - оно не имеет ничего общего с тестированием ширины экрана. Лучше дать этому столбцу более короткое имя, например, "zf2". Тогда у нас будет таблица, в которой «int1, int2 и zf2 имеют абсолютно одинаковую ширину, хотя int2 и zf2 задают небольшую ширину (3)».
ToolmakerSteve
32

Каков размер столбца int (11) в mysql в байтах?

(11)- этот атрибут типа intданных не имеет ничего общего с размером столбца. Это просто ширина отображения целочисленного типа данных. С 11.1.4.5. Атрибуты числового типа :

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

ks1322
источник
19

Хорошее объяснение этому можно найти здесь.

Подводя итог: число N в int (N) часто путают с максимально допустимым размером столбца, как это имеет место в случае varchar (N).

Но это не относится к типам данных Integer - число N в скобках - это не максимальный размер столбца, а просто параметр, указывающий MySQL, на какую ширину отображать столбец при просмотре данных таблицы через MySQL. консоль (когда вы используете атрибут ZEROFILL).

Число в скобках скажет MySQL, сколько нулей дополнить входящими целыми числами. Например: если вы используете ZEROFILL для столбца, для которого установлено значение INT (5) и вставлено число 78, MySQL будет дополнять это значение нулями до тех пор, пока число не будет соответствовать числу в скобках. то есть 78 станет 00078 и 127 станет 00127. Подводя итог: число в скобках используется для целей отображения.
В некотором смысле, число в скобках бесполезно, если только вы не используете атрибут ZEROFILL.

Таким образом, размер для int останется таким же, то есть от -2147483648 до 2147483648 для подписанного и от 0 до 4294967295 для неподписанного(~ 2,15 миллиарда и 4,2 миллиарда, что является одной из причин, по которой разработчики не знают о том, что стоит за цифрой N в скобках, так как она вряд ли повлияет на базу данных, если она не содержит более 2 миллиардов строк), а также в байтах будет 4 байта .

Для получения дополнительной информации о размере / диапазоне целочисленных типов см. Руководство MySQL.

shashi009
источник
Почему в игру вступает количество строк?
Старый Geezer
@OldGeezer - согласитесь, «количество строк» ​​не имеет значения для большинства столбцов. Относится только к автоинкрементному столбцу первичного ключа (id).
ToolmakerSteve
10

Хотя этот ответ вряд ли можно увидеть, я думаю, что стоит сделать следующее уточнение:

  • (n) за целочисленным типом данных в MySQL указывает ширину экрана
  • ширина дисплея НЕ ограничивает длину числа, возвращаемого запросом
  • ширина отображения ДОЛЖНА ограничивать количество заполненных нулями столбцов, заполненных нулями, поэтому общее число соответствует ширине отображения (при условии, что фактическое число не превышает ширину отображения, и в этом случае число отображается как есть)
  • ширина дисплея также полезна для разработчиков, чтобы узнать, к какой длине должно быть добавлено значение

БИТ ДЕТАЛИ,
ширина дисплея, по-видимому, предназначена для предоставления метаданных о том, сколько нулей отображать в заполненном нулями числе.
Это на самом деле не ограничивает длину числа, возвращаемого запросом, если это число превышает указанную ширину экрана.
Чтобы узнать, какая длина / ширина фактически разрешена для целочисленного типа данных в MySQL, смотрите список и ссылку: ( типы: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT );
Таким образом, сказав выше, вы можете ожидать, что ширина экрана не повлияет на результаты стандартного запроса, если только столбцы не заданы как столбцы ZEROFILL
ИЛИ
в случае, когда данные загружаются в приложение и это приложение собирает данные. ширина отображения, чтобы использовать для некоторого другого вида отступов.

Основная ссылка: https://blogs.oracle.com/jsmyth/entry/what_does_the_11_mean

MER
источник
Спасибо за правильный ответ. Я пытался из командной строки MySQL, и я не мог заставить его отбрасывать какие-либо цифры маленькими n, так что ... да, это чушь. Это только делает что-нибудь с zerofill.
mpen
@mpen рад, что смог помочь, это было связано с чем-то, что я пытался, и подумал, что мог бы разместить здесь более подробную информацию, которая может быть полезна для кого-то еще.
MER
9

В MySQL целое число int(11)имеет размер 4 байта, что равно 32 битам.

Значение со знаком: - 2^(32-1) to 0 to 2^(32-1)-1 = -2147483648 to 0 to 2147483647

Беззнаковые значения: 0 to 2^32-1 = 0 to 4294967295

Сачин Агравал
источник
0

согласно этой книге :

MySQL позволяет указать «ширину» для целочисленных типов, таких как INT (11). Это бессмысленно для большинства приложений: оно не ограничивает допустимый диапазон значений, а просто указывает количество символов, которые интерактивные инструменты MySQL будут резервировать для целей отображения. Для хранения и вычисления INT (1) идентичен INT (20).

Алиреза Рахмани Халили
источник
-4

Я думаю, что максимальное значение int (11) составляет 4294967295

Самуил
источник
2
Это 2147483647, потому что у него есть знак.
d3bit
-9

4294967295 является ответом, потому что int (11) показывает максимум 11 цифр IMO

Dudee
источник