Tinyint (N) ne anlama geliyor?


17

Sayısal veri türleriyle bir argüman uzunluğu kullandığımızda, bildiğim kadarıyla bu ekran genişliğini belirtir.
Aşağıdakileri denedim:

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)  

Her şeyden önce tinyint 1 baytlık bir değerdir. Peki anlamı tinyint(4)nedir? 4 basamak olamaz.

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'te 10 ve 101 depoladığımı ve tinyint olarak tanımlanmasına rağmen bu değerleri geri alabileceğimi görüyorum (1).
Bir tane görmemeliyim var1? Yani sadece 1 basamak mı?


Bir eklemeden sonra neden iki satırınız var? Bu kodu tam olarak anlayamıyorum.
WoodrowShigeru

Yanıtlar:


24

Veri-bilge, tinyint(1), tinyint(2), tinyint(3)vb hepsi tam olarak aynıdır. Hepsi -128 ila 127 SIGNEDveya 0-255 aralığındadır UNSIGNED. Diğer cevapların belirttiği gibi, parantez içindeki sayı sadece bir ekran genişliği ipucudur.

Bununla birlikte, uygulama = akıllıca şeylerin farklı görünebileceğini belirtmek isteyebilirsiniz. Burada tinyint(1)özel bir anlam alabilir. Örneğin, Connector / J (Java bağlayıcısı) tinyint(1)bir boole değeri olarak davranır ve uygulamaya sayısal bir sonuç döndürmek yerine değerleri trueve öğesine dönüştürür false. bu tinyInt1isBit=falsebağlantı parametresi ile değiştirilebilir .


13

Bir tinyint (1), veri tipinin 8 bit (1 bayt) olması nedeniyle -128 ila 127 aralığında sayılar tutabilir - açık bir şekilde işaretsiz bir tinyint 0-255 değerlerini tutabilir.

Aralık değerlerinin dışında sessizce kesilir:

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_modeveya sunucu yapılandırmasını değiştirmediğiniz sürece :

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'de veri türü için kullanılan değer (örneğin: tinyint (1)), şüphelendiğiniz gibi görüntüleme genişliğidir. Ancak, isteğe bağlıdır ve istemciler kullanmak zorunda değildir. Örneğin standart MySQL istemcisi bunu kullanmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.