Ý nghĩa của tinyint (N) là gì?


17

Khi chúng tôi sử dụng độ dài đối số với các loại dữ liệu số, theo như tôi biết điều này chỉ định chiều rộng hiển thị.
Tôi đã thử như sau:

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)  

Trước hết tinyint là giá trị 1 byte. Vậy ý nghĩa của nó là tinyint(4)gì? Không thể có 4 chữ số.

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)  

Tôi thấy rằng trong tinyint tôi đã lưu trữ 10 và 101 và tôi có thể lấy lại các giá trị này mặc dù nó được định nghĩa là tinyint (1).
Tôi không nên xem 1 cho var1? Tức là chỉ có 1 chữ số hiển thị?


Tại sao bạn có hai hàng sau một lần chèn? Tôi không thể hiểu đầy đủ mã này.
WoodrowShigeru

Câu trả lời:


24

Dữ liệu khôn ngoan, tinyint(1), tinyint(2), tinyint(3)vv đều giống hệt nhau. Tất cả đều nằm trong phạm vi -128 đến 127 cho SIGNEDhoặc 0-255 cho UNSIGNED. Như các câu trả lời khác lưu ý, số trong ngoặc đơn chỉ là một gợi ý về chiều rộng hiển thị.

Tuy nhiên, bạn có thể muốn lưu ý rằng ứng dụng đó = những điều khôn ngoan có thể khác. Ở đây, tinyint(1)có thể có một ý nghĩa đặc biệt. Ví dụ, Trình kết nối / J (Trình kết nối Java) coi tinyint(1)là giá trị boolean và thay vì trả về kết quả bằng số cho ứng dụng, nó chuyển đổi giá trị thành truefalse. điều này có thể được thay đổi thông qua tinyInt1isBit=falsetham số kết nối.


13

Một tinyint (1) có thể giữ các số trong phạm vi -128 đến 127, do kiểu dữ liệu là 8 bit (1 byte) - rõ ràng là một tinyint không dấu có thể giữ các giá trị 0-255.

Nó sẽ âm thầm cắt ra khỏi các giá trị phạm vi:

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>

... Trừ khi bạn thay đổi sql_modehoặc thay đổi cấu hình máy chủ:

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>

Giá trị được sử dụng trong DDL cho kiểu dữ liệu (ví dụ: tinyint (1)) là, như bạn nghi ngờ, chiều rộng hiển thị. Tuy nhiên, nó là tùy chọn và khách hàng không phải sử dụng nó. Máy khách MySQL tiêu chuẩn không sử dụng nó, ví dụ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.