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?


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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.