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


183

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

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

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


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 , как видно на скриншоте ниже :)

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


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)

11
Пожалуйста, отредактируйте свой ответ, чтобы включить некоторые объяснения. Ответы только на код мало что делают для обучения будущих читателей SO. Ваш ответ находится в очереди на модерацию за низкое качество.
mickmackusa

14

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

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

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


1
что значит «ширина дисплея»!?
realtebo

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

2
Но я не видел приложений или клиентов MySQL, которые используют эту функцию. Я всегда использую INT (11) и использую функции форматирования для настройки вывода.
Devart
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.