В чем смысл tinyint (N)?

17

Когда мы используем длину аргумента с числовыми типами данных, насколько я знаю, это определяет ширину экрана.
Я попробовал следующее:

mysql> create table boolean_test (var1 boolean, var2 tinyint);    
Query OK, 0 rows affected (0.10 sec)   

mysql> show create table boolean_test;   
+--------------+-------------------------   
| Table        | Create Table
+--------------+-------------------------  
| boolean_test | CREATE TABLE `boolean_test` (  
  `var1` tinyint(1) DEFAULT NULL,  
  `var2` tinyint(4) DEFAULT NULL  
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |   
+--------------+---------------------------  
1 row in set (0.00 sec)  

Прежде всего, tinyint - это 1-байтовое значение. Так в чем смысл tinyint(4)? Там не может быть 4 цифры.

mysql> insert into boolean_test values(101,112);  
Query OK, 1 row affected (0.03 sec)   

mysql> select * from boolean_test;  
+------+------+  
| var1 | var2 |  
+------+------+  
|   10 |  112 |  
|  101 |  112 |  
+------+------+  
2 rows in set (0.00 sec)  

Я вижу, что в tinyint я сохранил 10 и 101, и я мог получить эти значения, несмотря на то, что он определен как tinyint (1).
Разве я не вижу 1 для var1? Т.е. всего 1 отображаемая цифра?

Кратил
источник
Почему у вас есть две строки после одной вставки? Я не могу полностью понять этот код.
ВудроШигеру

Ответы:

24

Данные-мудрый, tinyint(1), tinyint(2), и tinyint(3)т.д., все точно так же. Все они находятся в диапазоне от -128 до 127 для SIGNEDили от 0 до 255 для UNSIGNED. Как отмечалось в других ответах, число в скобках - это просто подсказка ширины дисплея.

Вы можете заметить, однако, что приложения = мудрые вещи могут выглядеть иначе. Здесь tinyint(1)может иметь особое значение. Например, Connector / J (Java-коннектор) обрабатывается tinyint(1)как логическое значение, и вместо возврата числового результата в приложение он преобразует значения в trueи false. это можно изменить с помощью tinyInt1isBit=falseпараметра подключения.

Шломи Ноах
источник
13

Tinyint (1) может содержать числа в диапазоне от -128 до 127, поскольку тип данных составляет 8 бит (1 байт) - очевидно, что unsigned tinyint может содержать значения 0-255.

Он будет молча обрезать вне диапазона значений:

mysql> create table a
    -> (
    ->    ttt tinyint(1)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> insert into a values ( 127 );
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values ( -128 );
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values ( 128 );
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into a values ( -129 );
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from a;
+------+
| ttt  |
+------+
|  127 |
| -128 |
|  127 |
| -128 |
+------+
4 rows in set (0.00 sec)

mysql>

... если вы не измените sql_modeили не измените конфигурацию сервера:

mysql> set sql_mode=STRICT_ALL_TABLES;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into a values ( -129 );
ERROR 1264 (22003): Out of range value for column 'ttt' at row 1
mysql>

Значение, используемое в DDL для типа данных (например: tinyint (1)), как вы и предполагали, представляет собой ширину экрана. Тем не менее, это необязательно, и клиенты не должны использовать его. Например, стандартный клиент MySQL не использует его.

Philᵀᴹ
источник