ความหมายของ 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)สามารถใช้ความหมายพิเศษ ยกตัวอย่างเช่นการเชื่อมต่อ / J (ขั้วต่อ Java) ถือว่าtinyint(1)เป็นค่าบูลีนและแทนที่จะกลับผลตัวเลขไปยังโปรแกรมประยุกต์จะแปลงค่าและtrue falseสิ่งนี้สามารถเปลี่ยนแปลงได้ผ่านทางtinyInt1isBit=falseพารามิเตอร์การเชื่อมต่อ


13

Tinyint (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 มาตรฐานไม่ได้ใช้งาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.