Apa arti tinyint (N)?

17

Ketika kita menggunakan panjang argumen dengan tipe data numerik, sejauh yang saya tahu ini menentukan lebar tampilan.
Saya mencoba yang berikut ini:

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)  

Pertama-tama tinyint adalah nilai 1 byte. Jadi apa artinya tinyint(4)? Tidak boleh ada 4 digit.

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)  

Saya melihat bahwa di tinyint saya menyimpan 10 dan 101 dan saya bisa mendapatkan kembali nilai-nilai ini meskipun itu didefinisikan sebagai tinyint (1).
Bukankah seharusnya saya melihat angka 1 untuk var1? Yaitu hanya 1 digit tampilan?

Cratylus
sumber
Mengapa Anda memiliki dua baris setelah satu sisipan? Saya tidak dapat sepenuhnya memahami kode ini.
WoodrowShigeru

Jawaban:

24

Data-bijaksana, tinyint(1), tinyint(2), tinyint(3)dll semua persis sama. Mereka semua berada dalam kisaran -128 hingga 127 untuk SIGNEDatau 0-255 untuk UNSIGNED. Seperti jawaban lain yang dicatat, angka dalam kurung hanyalah petunjuk lebar layar.

Anda mungkin ingin mencatat, bahwa aplikasi = hal-hal bijak mungkin terlihat berbeda. Di sini, tinyint(1)bisa mengambil makna khusus. Misalnya, Connector / J (konektor Java) memperlakukan tinyint(1)sebagai nilai boolean, dan alih-alih mengembalikan hasil numerik ke aplikasi, itu mengkonversi nilai menjadi truedan false. ini dapat diubah melalui tinyInt1isBit=falseparameter koneksi.

Shlomi Noach
sumber
13

Smallint (1) dapat menyimpan angka dalam rentang -128 hingga 127, karena datatype menjadi 8 bit (1 byte) - jelas tinyint yang tidak ditandai dapat menyimpan nilai 0-255.

Ini akan secara diam-diam memotong nilai rentang:

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>

... kecuali Anda mengubah sql_modeatau mengubah konfigurasi server:

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>

Nilai yang digunakan dalam DDL untuk tipe data (misalnya: tinyint (1)), seperti yang Anda duga, lebar layar. Namun, ini opsional dan klien tidak harus menggunakannya. Klien standar MySQL tidak menggunakannya, misalnya.

Philᵀᴹ
sumber