อะไรคือความแตกต่างระหว่าง BIT และ TINYINT ใน MySQL?


107

คุณจะใช้อันไหนในกรณีใด มีความแตกต่างกันมากหรือไม่? ที่ฉันมักใช้โดยเครื่องมือคงอยู่ในการจัดเก็บบูลีน

คำตอบ:


123

TINYINT คือค่าจำนวนเต็ม 8 บิตฟิลด์ BIT สามารถจัดเก็บระหว่าง 1 บิต BIT (1) และ 64 บิต BIT (64) สำหรับค่าบูลีน BIT (1) นั้นค่อนข้างธรรมดา


10
อะไรคือความแตกต่างระหว่าง TINYINT และ BIT (8)?
Pacerier

16
TINYINT สามารถลงนามหรือไม่ได้ลงนามและเกี่ยวข้องกับจำนวนลบ Bit เพียงแค่เก็บบิตโดยไม่ต้องลงนามข้อมูลคุณจะต้องตีความ MSB ด้วยตัวเอง
กำหนด

4
เพื่อหลีกเลี่ยงการเกิดความสับสนก็ควรจะเสริมว่า TINYINT และ BIT (1) ไม่แตกต่างกันของพวกเขาในความต้องการจัดเก็บและบูลและบูลีนเป็นคำพ้องความหมายสำหรับ TINYINT (1) ตัวเลขประเภทภาพรวม
Timo Strotmann

59

จากภาพรวมของชนิดของตัวเลข ;

บิต [(M)]

ประเภทบิตฟิลด์ M ระบุจำนวนบิตต่อค่าตั้งแต่ 1 ถึง 64 ค่าดีฟอลต์คือ 1 ถ้า M ถูกละไว้

ชนิดข้อมูลนี้ถูกเพิ่มใน MySQL 5.0.3 สำหรับ MyISAM และขยายใน 5.0.5 เป็น MEMORY, InnoDB, BDB และ NDBCLUSTER ก่อน 5.0.3 BIT เป็นคำพ้องความหมายของ TINYINT (1)

TINYINT [(M)] [UNSIGNED] [ZEROFILL]

จำนวนเต็มขนาดเล็กมาก ช่วงที่เซ็นชื่อคือ -128 ถึง 127 ช่วงที่ไม่ได้ลงชื่อคือ 0 ถึง 255

นอกจากนี้พิจารณาสิ่งนี้

บูลบูลีน

ประเภทเหล่านี้เป็นคำพ้องความหมายของ TINYINT (1) ค่าศูนย์ถือเป็นเท็จ ค่าที่ไม่ใช่ศูนย์ถือว่าเป็นจริง


12
คุณกำลังบอกว่าbooleanจะใช้ไบต์แม้ว่ามันจะเป็นบิตจริงๆดังนั้น BIT (1) จะดีกว่าหลังจาก v5.0.3?
Pacerier

3
ใช่ @Pacerier บูลีนเป็นเพียงนามแฝงที่น่าเกลียดสำหรับฟิลด์ตัวเลข
Áxel Costas Pena

7
เท่าที่จัดเก็บข้อมูลจริง BIT (1) ยังคงใช้ขั้นต่ำหนึ่งไบต์ BIT (M) = (M + 7) / 8 ไบต์ (1 + 7) / 8 = 1 ไบต์ ดูความต้องการของตัวเลขประเภทการจัดเก็บข้อมูล
Drazen Bjelovuk

1
น่าเศร้าที่BOOL/ BOOLEANมีนามแฝงสำหรับแทนTINYINT(1) BITแน่นอนว่าพวกเขาทั้งหมดครอบครองไบต์ทั้งหมด แต่ความหมายBITจะเหมาะสมกว่ามาก
MestreLion

40

การอภิปรายเชิงทฤษฎีทั้งหมดนี้เป็นเรื่องที่ดี แต่ในความเป็นจริงอย่างน้อยถ้าคุณใช้ MySQL และสำหรับ SQLServer ด้วยเช่นกันคุณควรยึดติดกับข้อมูลที่ไม่ใช่ไบนารีสำหรับบูลีนของคุณด้วยเหตุผลง่ายๆที่ง่ายต่อการทำงานเมื่อคุณ กำลังส่งออกข้อมูลการสืบค้นและอื่น ๆ เป็นสิ่งสำคัญอย่างยิ่งหากคุณกำลังพยายามบรรลุความสามารถในการทำงานร่วมกันระหว่าง MySQL และ SQLServer (เช่นคุณซิงค์ข้อมูลระหว่างทั้งสอง) เนื่องจากการจัดการประเภทข้อมูล BIT นั้นแตกต่างกันในสองประเภทนี้ ดังนั้นในทางปฏิบัติคุณจะมีความยุ่งยากน้อยลงมากหากคุณยึดติดกับประเภทข้อมูลที่เป็นตัวเลข ฉันอยากจะแนะนำให้ MySQL ติดกับ BOOL หรือ BOOLEAN ซึ่งได้รับการจัดเก็บเป็น TINYINT (1) แม้แต่วิธีที่ MySQL Workbench และ MySQL Administrator แสดงประเภทข้อมูล BIT ก็ไม่ดี (เป็นสัญลักษณ์เล็กน้อยสำหรับข้อมูลไบนารี)


1
ในความคิดของฉันมันไม่ใช่ความผิดของฉันที่อินเทอร์เฟซบางอย่าง ฯลฯ ตีความข้อมูลไบนารีที่ถูกต้องไม่ถูกต้อง หากผู้ดูแลระบบ (รวมถึงตัวฉันเอง) บ่นเกี่ยวกับสัญลักษณ์บางอย่าง (อ้างถึง MySQL Wrokbench) นี่เป็นความผิดของใครก็ตามที่ตีความข้อมูล (ไบนารี) ที่ถูกต้องของฉันเป็นสัญลักษณ์ที่ไม่ให้ข้อมูลเกี่ยวกับเนื้อหา ดังนั้น MySQL / Oracle จึงทำผิดพลาดและฉันไม่เต็มใจที่จะเปลี่ยนแนวคิดการเขียนโปรแกรมของฉันเพียงเพราะมีใครทำผิดพลาด
Matmarbon

11

BIT ควรอนุญาตเฉพาะ 0 และ 1 (และ NULL หากฟิลด์ไม่ได้กำหนดเป็น NOT NULL) TINYINT (1) อนุญาตให้มีค่าใด ๆ ที่สามารถจัดเก็บในไบต์เดียว -128..127 หรือ 0..255 ขึ้นอยู่กับว่าไม่ได้ลงนามหรือไม่ (ค่า 1 แสดงว่าคุณตั้งใจจะใช้ตัวเลขหลักเดียวเท่านั้น แต่ไม่ ไม่ป้องกันไม่ให้คุณจัดเก็บค่าที่มากขึ้น)

สำหรับเวอร์ชันที่เก่ากว่า 5.0.3 BIT จะตีความเป็น TINYINT (1) ดังนั้นจึงไม่มีความแตกต่าง

BIT มีความหมาย "นี่คือบูลีน" และบางแอปจะพิจารณา TINYINT (1) ในลักษณะเดียวกัน (เนื่องจากวิธีที่ MySQL ใช้ในการจัดการ) ดังนั้นแอปอาจจัดรูปแบบคอลัมน์เป็นช่องทำเครื่องหมายหากตรวจสอบประเภท และตัดสินใจเลือกรูปแบบตามนั้น


5

อาจจะผิด แต่:

Tinyint เป็นจำนวนเต็มระหว่าง 0 ถึง 255

บิตเป็น 1 หรือ 0

ดังนั้นสำหรับฉันบิตเป็นทางเลือกสำหรับบูลีน


ขออภัยคิดว่าเราใช้ T_SQL ที่นี่ดังนั้นฉันจึงไม่รู้
Allen Hardy

0

จากประสบการณ์ของฉันฉันบอกคุณว่า BIT มีปัญหาในประเภท linux OS (Ubuntu สำหรับอดีต) ฉันพัฒนาฐานข้อมูลของฉันบน windows และหลังจากที่ฉันปรับใช้ทุกอย่างบน linux ฉันมีปัญหากับการสืบค้นที่แทรกหรือเลือกจากตารางที่มี BIT DATA TYPE

บิตไม่ปลอดภัยในตอนนี้ ฉันเปลี่ยนเป็น tinyint (1) และทำงานได้อย่างสมบูรณ์ ฉันหมายความว่าคุณต้องการค่าเพื่อแยกความแตกต่างถ้าเป็น 1 หรือ 0 และ tinyint (1) ก็ใช้ได้

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