MySql: Tinyint (2) vs tinyint (1) - อะไรคือความแตกต่าง?


183

ผมรู้ว่าบูลใน MySQL tinyint (1)เป็น

วันนี้ผมดูตารางที่มีกำหนดเป็นจำนวนเต็มเหมือนtinyint(2)และยังคนอื่น ๆ ชอบint(4), int(6)...

ขนาดหมายถึงอะไรในฟิลด์ของจำนวนเต็มชนิดและ tinyint?


4
อ่านข้อมูลเกี่ยวกับ MySQL จำนวนเต็มชนิดข้อมูลที่นี่
Bud Damyanov

2
@ คำตอบของ AamirR เป็นคำตอบที่ถูกต้อง
evilReiko

1
@evilReiko zerofill ยังไม่ได้สร้างความแตกต่างในวิธีการเก็บค่ามันเป็นเรื่องการนำเสนอ ... ช่องว่างหรือศูนย์ไม่ได้สร้างความแตกต่างในความถูกต้องของคำตอบของทุกคน
Ja͢ck

คำตอบ:


94

มันหมายถึงความกว้างของจอแสดงผล

ไม่ว่าคุณจะใช้ Tinyint (1) หรือ Tinyint (2) ก็ไม่ได้สร้างความแตกต่าง

ฉันมักจะใช้ tinyint (1) และ int (11) ฉันใช้ไคลเอนต์ mysql หลายตัว (navicat, sequel pro)

มันไม่ได้มีความหมายอะไรเลย! ฉันทำการทดสอบทั้งหมดข้างต้นไคลเอนต์หรือแม้แต่ลูกค้าบรรทัดคำสั่งดูเหมือนจะไม่สนใจสิ่งนี้

แต่ความกว้างของจอแสดงผลสำคัญที่สุดหากคุณใช้ZEROFILLตัวเลือกตัวอย่างเช่นตารางของคุณมี 2 คอลัมน์ต่อไปนี้:

ซีโรฟิลขนาดจิ๋ว (2)

B tinyint (4) ซีโรฟิล

ทั้งสองคอลัมน์มีค่าเป็น 1 เอาท์พุทสำหรับคอลัมน์Aจะเป็น01และ0001สำหรับBตามที่เห็นในภาพหน้าจอด้านล่าง :)

zerofill พร้อม displaywidth


20
อย่างแปลกประหลาดพอฉันเพิ่งค้นพบว่าในตัวเชื่อมต่อ MySQL อย่างเป็นทางการ C # จิ๋ว (1) ไม่เคยส่งคืนค่าที่แตกต่างจาก 0 และ 1 สิ่งนี้อาจจะเกี่ยวข้องกับ tinyint (1) โดยอัตโนมัติได้รับการยอมรับว่าเป็นบูลีน แค่หัวขึ้นบางครั้งมันก็สำคัญ
Daniel Sharp

การใช้ประเภทและความยาวของจำนวนเต็มน้อยกว่านี้หรือไม่ ฉันรู้สึกว่าหน่วยความจำที่บันทึกไว้ใน MySQL นี้อยู่ในความประทับใจ
nclsvh

@ Daniel-Sharp ชี้ให้เห็นว่าอาจมีความสำคัญกับตัวเชื่อมต่อ เพิ่งมีปัญหากับไฮเบอร์เนตโดยใช้ JDBC รายงานมันตีความ TINYINT (1) เป็น BIT
sfj

2
@DanielSharp ที่อาจเกิดจากตัวเลือกการเชื่อมต่อ tinyInt1isBit ซึ่งเป็นค่าเริ่มต้นที่เป็นจริง ดูdev.mysql.com/doc/connector-j/8.0/en/…
Parisbre56

1
ฉันคิดเสมอว่าสิ่งนี้เกี่ยวข้องกับจำนวนตัวเลขที่ได้รับการยอมรับ (ตัวอย่างเช่น int (4) ที่ไม่อนุญาตให้มีค่าเกิน 9999) เดาว่าฉันคิดผิดอยู่เสมอ ในทั้งบรรทัดคำสั่ง PHP และ MySQL ฉันเห็นค่าข้างต้นมันดี
Joshua Bakker

226

(m)แสดงให้เห็นความกว้างของจอแสดงผลคอลัมน์; แอปพลิเคชันเช่นไคลเอนต์ MySQL ใช้ประโยชน์จากสิ่งนี้เมื่อแสดงผลลัพธ์ของแบบสอบถาม

ตัวอย่างเช่น:

| v   | a   |  b  |   c |
+-----+-----+-----+-----+
| 1   | 1   |  1  |   1 |
| 10  | 10  | 10  |  10 |
| 100 | 100 | 100 | 100 |

ที่นี่a, bและcกำลังใช้TINYINT(1), TINYINT(2)และTINYINT(3)ตามลำดับ อย่างที่คุณเห็นมันเป็นแผ่นค่าทางด้านซ้ายโดยใช้ความกว้างของจอแสดงผล

มันเป็นสิ่งสำคัญที่จะต้องทราบว่ามันไม่ได้ส่งผลกระทบในช่วงที่ได้รับการยอมรับของค่าสำหรับประเภทโดยเฉพาะอย่างยิ่งคือยังคงยอมรับTINYINT(1)[-128 .. 127]


16
'ความกว้างของคอลัมน์' หมายความว่าอย่างไร
realtebo

8
@realtebo ส่วนใหญ่จะใช้โดยไคลเอนต์บรรทัดคำสั่ง mysql เพื่อการแสดงผล
Ja͢ck

3
จำนวน "หลัก" ที่แสดงโดยอินเตอร์เฟส กล่าวอีกนัยหนึ่งมันจะเป็นศูนย์ที่ด้านซ้าย คุณสมบัติประเภทนี้มีความหมายในยุคแรก ๆ ของฐานข้อมูล แต่ตอนนี้มันเป็นเพียงมรดก
Denilson Sá Maia

2
@Kailas หากคุณไม่ได้ใช้ไคลเอนต์ mysql? ไม่มีเลย
Ja͢ck

11
@Kailas ไม่! tinyint (1) ไม่ยอมรับเฉพาะ 0-9 ยอมรับทุกช่วงของสิ่งเล็ก ๆ ที่จับได้
Ja͢ck

18
mysql> CREATE TABLE tin3(id int PRIMARY KEY,val TINYINT(10) ZEROFILL);
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO tin3 VALUES(1,12),(2,7),(4,101);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tin3;
+----+------------+
| id | val        |
+----+------------+
|  1 | 0000000012 |
|  2 | 0000000007 |
|  4 | 0000000101 |
+----+------------+
3 rows in set (0.00 sec)

mysql>

mysql> SELECT LENGTH(val) FROM tin3 WHERE id=2;
+-------------+
| LENGTH(val) |
+-------------+
|          10 |
+-------------+
1 row in set (0.01 sec)


mysql> SELECT val+1 FROM tin3 WHERE id=2;
+-------+
| val+1 |
+-------+
|     8 |
+-------+
1 row in set (0.00 sec)

11
โปรดแก้ไขคำตอบของคุณเพื่อรวมคำอธิบายบางอย่าง คำตอบที่ใช้รหัสเท่านั้นจะทำน้อยมากเพื่อให้ความรู้ผู้อ่าน SO ในอนาคต คำตอบของคุณอยู่ในคิวการกลั่นกรองที่มีคุณภาพต่ำ
mickmackusa

14

เกี่ยวกับ INT, TINYINT ... เหล่านี้เป็นชนิดข้อมูลที่แตกต่างกัน INT คือหมายเลข 4 ไบต์, TINYINT คือหมายเลข 1 ไบต์ ข้อมูลเพิ่มเติมที่นี่ - จำนวนเต็ม INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT

ไวยากรณ์ของประเภทข้อมูล TINYINT คือ TINYINT (M) โดย M ระบุความกว้างของการแสดงผลสูงสุด (ใช้เฉพาะเมื่อไคลเอนต์ MySQL ของคุณรองรับเท่านั้น)

ตัวเลขประเภทคุณสมบัติ


1
'ความกว้างหน้าจอ' หมายความว่าอย่างไร?
realtebo

2
จากการอ้างอิง - ตัวอย่างเช่น INT (4) ระบุ INT ที่มีความกว้างของการแสดงผลสี่หลัก ความกว้างในการแสดงผลที่เป็นทางเลือกนี้อาจถูกใช้โดยแอปพลิเคชันเพื่อแสดงค่าจำนวนเต็มที่มีความกว้างน้อยกว่าความกว้างที่ระบุสำหรับคอลัมน์โดยการขยายด้านซ้ายด้วยช่องว่าง
Devart

2
แต่ฉันไม่เห็นแอปพลิเคชั่นหรือไคลเอนต์ MySQL ที่ใช้คุณสมบัตินี้ ฉันมักจะใช้ INT (11) และใช้ฟังก์ชั่นการจัดรูปแบบเพื่อปรับแต่งเอาท์พุท
Devart
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.