MySql: Tinyint (2) против tinyint (1) - в чем разница?

183

Я знал, что логическое в MySQL как tinyint (1).

Сегодня я вижу таблицу с определенным целым, как tinyint(2), а также другие, как int(4), int(6)...

Что означает размер в поле типа integer и tinyint?

realtebo
источник
4
Читайте о типах данных MySQL Integer здесь .
Бад Дамьянов
2
Ответ @ AamirR правильный
evilReiko
1
@evilReiko zerofill также не имеет значения в том, как хранится значение, на самом деле речь идет о представлении ... пробелы или нули на самом деле не
влияют

Ответы:

94

Это означает ширину дисплея

Используете ли вы tinyint (1) или tinyint (2), это не имеет никакого значения.

Я всегда использую tinyint (1) и int (11), я использовал несколько клиентов mysql (navicat, sequel pro).

Это вообще ничего не значит! Я запустил тест, все вышеперечисленные клиенты или даже клиент командной строки, кажется, игнорируют это.

Но ширина экрана наиболее важна, если вы используете ZEROFILLопцию, например, ваша таблица имеет следующие 2 столбца:

TINYINT (2) ZEROFILL

B tinyint (4) Зерофилл

у обоих столбцов есть значение 1, вывод для столбца A будет 01и 0001для B , как видно на скриншоте ниже :)

нулевое заполнение с пропускной способностью

AamirR
источник
20
Как ни странно, я только что обнаружил, что в официальном коннекторе MySQL C # tinyint (1) никогда не возвращает значений, отличных от 0 и 1. Это, вероятно, связано с то, что tinyint (1) автоматически распознается как логическое значение. Иногда это важно.
Даниэль Шарп
Не лучше ли использовать целочисленный тип и длину как можно меньше? У меня сложилось впечатление, что эта сохраненная память в MySQL.
nclsvh
Как указывает @ Daniel-Sharp, это может показаться важным для разъемов. Только что возникла проблема с Hibernate при использовании JDBC, сообщившего, что он интерпретировал TINYINT (1) как BIT.
sfj
2
@DanielSharp, вероятно, из-за опции соединения tinyInt1isBit, которая по умолчанию имеет значение true. См dev.mysql.com/doc/connector-j/8.0/en/...
Parisbre56
1
Я всегда думал, что это как-то связано с количеством принимаемых чисел (например, int (4) не допускает ничего выше 9999). Думаю, я всегда думал неправильно. Как в PHP, так и в командной строке MySQL я вижу значение выше этого нормально.
Джошуа Баккер,
226

(m)Указывает ширину отображения столбца; приложения, такие как клиент MySQL, используют это при отображении результатов запроса.

Например:

| v   | a   |  b  |   c |
+-----+-----+-----+-----+
| 1   | 1   |  1  |   1 |
| 10  | 10  | 10  |  10 |
| 100 | 100 | 100 | 100 |

Здесь a, bи cиспользуют TINYINT(1), TINYINT(2)и TINYINT(3)соответственно. Как вы можете видеть, он дополняет значения с левой стороны, используя ширину экрана.

Важно отметить, что это не влияет на принятый диапазон значений для этого конкретного типа, т.е. TINYINT(1)все еще принимает [-128 .. 127].

Разъем
источник
16
что значит "ширина столбца" ??
realtebo
8
@realtebo в основном используется клиентом командной строки mysql для отображения.
Ja͢ck
3
Количество «цифр» отображается интерфейсом. Другими словами, он будет дополнять нулями слева. Такая функция имела некоторый смысл в ранние времена баз данных, но теперь это просто наследие.
Денилсон Са Майя
2
@Kailas Если вы не используете клиент MySQL? Вовсе нет.
Ja͢ck
11
@ Кайлас Нет! tinyint (1) не принимает только 0-9. Он принимает весь диапазон того, что может содержать tinyint.
Ja͢ck
18
mysql> CREATE TABLE tin3(id int PRIMARY KEY,val TINYINT(10) ZEROFILL);
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO tin3 VALUES(1,12),(2,7),(4,101);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tin3;
+----+------------+
| id | val        |
+----+------------+
|  1 | 0000000012 |
|  2 | 0000000007 |
|  4 | 0000000101 |
+----+------------+
3 rows in set (0.00 sec)

mysql>

mysql> SELECT LENGTH(val) FROM tin3 WHERE id=2;
+-------------+
| LENGTH(val) |
+-------------+
|          10 |
+-------------+
1 row in set (0.01 sec)


mysql> SELECT val+1 FROM tin3 WHERE id=2;
+-------+
| val+1 |
+-------+
|     8 |
+-------+
1 row in set (0.00 sec)
zloctb
источник
11
Пожалуйста, отредактируйте свой ответ, чтобы включить некоторые объяснения. Ответы только на код мало что делают для обучения будущих читателей SO. Ваш ответ находится в очереди на модерацию за низкое качество.
mickmackusa
14

О INT, TINYINT ... Это разные типы данных, INT - это 4-байтовое число, TINYINT - это 1-байтовое число. Больше информации здесь - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT .

Синтаксис типа данных TINYINT - TINYINT (M), где M указывает максимальную ширину экрана (используется только в том случае, если ваш клиент MySQL поддерживает ее).

Атрибуты числового типа .

Devart
источник
1
что значит «ширина дисплея»!?
realtebo
2
Из справочника - Например, INT (4) определяет INT с шириной отображения четырех цифр. Эта необязательная ширина отображения может использоваться приложениями для отображения целочисленных значений, имеющих ширину, меньшую ширины, указанной для столбца, путем их заполнения слева пробелами.
Devart
2
Но я не видел приложений или клиентов MySQL, которые используют эту функцию. Я всегда использую INT (11) и использую функции форматирования для настройки вывода.
Devart