<rmcreative>

RSS

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

  1. №6735
    rettemp
    rettemp 24 сент. 2012 г., 20:56:50

    int(i) i - это не ограничение разрядности, int всегда одинаков -2в31 до +2в31-1 (или 0 до 2в32-1), а ограничение количества показываемых символов при отображении столбца, его значение от 1 до 255. Например, INT(5) объявляет столбец целого типа который при отображении будет выводиться в колонках по пять цифр. Если в столбце реально записано значение которое нельзя отобразить 5-тью цифрами то оно будет отображено большим количеством символов, т.е. при выводе значение не усекается.

  2. №6736
    Максим
    Максим 24 сент. 2012 г., 22:52:39

    Ты бы посмотрел еще про длину текста в varchar :)

  3. №6737
    romanitalian
    romanitalian 24 сент. 2012 г., 23:27:02

    Почти вечный вопрос :) Спасибо.

  4. №6738
    Sam
    Sam 24 сент. 2012 г., 23:38:43

    rettemp, я вроде именно это и написал.

  5. №6740
    RusAlex
    RusAlex 25 сент. 2012 г., 10:28:30

    еще год назад писал create table player ( id int(11) unsigned not null auto_increment primary key team_id int(11) unsigned not null );

    сейчас проще, без указания "размера". Столкнулся с этим когда вроде ключи были расставлены, а выборки были медленными. Дело было как раз в разных "размерах".

  6. №6741
    Nikolay
    Nikolay 25 сент. 2012 г., 11:41:56

    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 )

  7. №6742
    rettemp
    rettemp 25 сент. 2012 г., 15:46:25

    ... и да, если нужно было добиться именно ограничения по разрядности то нужно применять конструкцию "BIT(i)"? здесь i - ограничение разрядности числа. Например, BIT(5) - объявляет поле которое может хранить значения от 0 до 2^i.

    to Sam: я вроде именно это и написал.

    да, но мне показалось я немного уточнил, ну или попытался это сделать

  8. №6743
    Sam
    Sam 25 сент. 2012 г., 16:24:09

    rettemp, спасибо.

  9. №6745
    Alek
    Alek 26 сент. 2012 г., 23:04:36

    Блин, ну вот зафига такие заметки писать? Я теперь себя всю неделю буду идиотом чувствовать - всю жизнь думал, что это размер, даже тени сомнения не было ...

  10. №6865
    SnowLeo
    SnowLeo 20 окт. 2012 г., 11:00:08

    Alex, +1 тоже всю жизнь так считал :)

  11. №7062
    Игорь
    Игорь 17 нояб. 2012 г., 20:37:10

    Ммм... Это у кого такие вопросы возникают? N влияет лишь на ширину столбца в режиме CLI, насколько я знаю.

  12. №7703
    zedget
    zedget 18 марта 2013 г., 16:41:57

    Век живи, век учись :)

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.