Яке значення 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 цифра відображення?


Чому у вас два ряди після однієї вставки? Я не можу повністю зрозуміти цей код.
WoodrowShigeru

Відповіді:


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

Тиньїнт (1) може містити числа в діапазоні від -128 до 127, завдяки тому, що тип даних становить 8 біт (1 байт) - очевидно, ненаписаний 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, наприклад, не використовує його.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.