MySQL, длина int
24 сентября 2012
Провёл опрос знакомых разработчиков. По результатам выяснилось, что документация MySQL совсем не помогает понять, что же такое N
в типе данных int(N)
.
Если вы думаете, что это размер хранимых данных в байтах или символах, то это не так. В int(1)
запросто можно записать 2147483647
.
Если вы думаете, что это максимальное количество символов, которое база вам покажет при SELECT
, то это, опять же, не совсем так.
CREATE TABLE `test` ( `number` int(3) DEFAULT NULL, `zerofill_number` int(3) unsigned zerofill DEFAULT NULL ); INSERT INTO test (number, zerofill_number) VALUES (123456789, 123456789), (1, 1); SELECT * FROM test;
На выходе получим:
number | zerofill_number --------------------------- 123456789 | 123456789 1 | 001
То есть в случае int(3) DEFAULT NULL
у нас (3)
вообще ни на что не повлиял (разве что MySQL будет материться на непонятном языке при попытке добавить FK, где с другой стороны, например, int(11)
).
В случае же int(3) unsigned zerofill DEFAULT NULL
получаем аналог PHP-шного str_pad. То есть, если при преобразовании значения в строку эта самая строка короче N
, то она добивается слева нулями до длины N
.
И в том и в другом случае размер данных никак не меняется.
Комментарии RSS по email OK
int(i) i - это не ограничение разрядности, int всегда одинаков -2в31 до +2в31-1 (или 0 до 2в32-1), а ограничение количества показываемых символов при отображении столбца, его значение от 1 до 255. Например, INT(5) объявляет столбец целого типа который при отображении будет выводиться в колонках по пять цифр. Если в столбце реально записано значение которое нельзя отобразить 5-тью цифрами то оно будет отображено большим количеством символов, т.е. при выводе значение не усекается.
Ты бы посмотрел еще про длину текста в varchar :)
Почти вечный вопрос :) Спасибо.
rettemp, я вроде именно это и написал.
еще год назад писал create table player ( id int(11) unsigned not null auto_increment primary key team_id int(11) unsigned not null );
сейчас проще, без указания "размера". Столкнулся с этим когда вроде ключи были расставлены, а выборки были медленными. Дело было как раз в разных "размерах".
rettemp is correct.
Unlike some other bases such Oracle, in mMySQL int(8) does not mean 8 bytes.
same apply for :
tinyint - 1 byte (-127 to +127)
smallint - 2 bytes
int - 4 bytes
bigint - 8 bytes.
The only type where those are important is decimal. decimal(10, 2) means 8 numbers before decimal point and 2 after (why 8? because 10 - 2 = 8 )
... и да, если нужно было добиться именно ограничения по разрядности то нужно применять конструкцию "BIT(i)"? здесь i - ограничение разрядности числа. Например, BIT(5) - объявляет поле которое может хранить значения от 0 до 2^i.
да, но мне показалось я немного уточнил, ну или попытался это сделать
rettemp, спасибо.
Блин, ну вот зафига такие заметки писать? Я теперь себя всю неделю буду идиотом чувствовать - всю жизнь думал, что это размер, даже тени сомнения не было ...
Alex, +1 тоже всю жизнь так считал :)
Ммм... Это у кого такие вопросы возникают? N влияет лишь на ширину столбца в режиме CLI, насколько я знаю.
Век живи, век учись :)