ความสับสนของ BOOLEAN หรือ TINYINT


93

ฉันกำลังออกแบบฐานข้อมูลสำหรับไซต์ที่ฉันต้องใช้ประเภทข้อมูลบูลีนเพื่อจัดเก็บเพียง 2 สถานะคือจริงหรือเท็จ ฉันใช้ MySQL
ขณะออกแบบฐานข้อมูลโดยใช้ phpMyAdmin ฉันพบว่ามีทั้งประเภทข้อมูล BOOLEAN และประเภทข้อมูล TINYINT
ฉันอ่านบทความต่างๆบางบทความกล่าวว่า TINYINT เหมือนกับ BOOLEAN ไม่มีความแตกต่าง บางคนบอกว่า BOOLEAN ถูกแปลงเป็น TINYINT ใน MySQL

คำถามของฉันคือถ้าทั้งคู่เหมือนกันทำไมถึงมีสองตัว? ควรมีเพียงหนึ่งในนั้น

นี่คือข้อมูลอ้างอิงของบทความที่ฉันอ่าน:
http://www.careerride.com/MySQL-BOOL-TINYINT-BIT.aspx
http://dev.mysql.com/doc/refman/5.5/en/numeric-type -overview.html

คำตอบ:


137

MySQL ไม่มีประเภทข้อมูลบูลีนภายใน ใช้ชนิดข้อมูลจำนวนเต็มน้อยที่สุด - TINYINT

BOOLEAN และ BOOL เทียบเท่ากับ TINYINT (1) เนื่องจากเป็นคำพ้องความหมาย

ลองสร้างตารางนี้ -

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

จากนั้นเรียกใช้ SHOW CREATE TABLE คุณจะได้ผลลัพธ์นี้ -

CREATE TABLE `table1` (
  `column1` tinyint(1) DEFAULT NULL
)

1
แต่คำตอบของคุณถูกต้องในแง่มุมอื่น ๆ สิ่งที่ดูเหมือนจะสับสน OP คือการมีอยู่ของคำพ้องความหมาย
ypercubeᵀᴹ

2
ดูเหมือนว่าจะทำเพื่อความเข้ากันได้แบบย้อนหลัง ประเภทข้อมูล BOOLEAN อยู่ก่อน MySQL 5 และไม่ใช่ประเภท BIT ที่ปรับให้เหมาะสมที่สุด แต่ก็ยังเป็น TINYINT จากเอกสารประกอบ - คุณลักษณะใหม่ที่วางแผนไว้สำหรับ 5.1: เพิ่มประสิทธิภาพประเภท BIT เพื่อใช้เวลาหนึ่งบิต (ตอนนี้ BIT ใช้เวลาหนึ่งไบต์ถือว่าเป็นคำพ้องความหมายสำหรับ TINYINT)
Devart

5
ใช่คุณสามารถรู้ว่ามีBIT(1)หรือBIT(17)หรือแม้กระทั่งBIT(64)
ypercubeᵀᴹ

3
@Devart - ที่คำตอบของคุณมีคะแนนโหวตมากที่สุดและปรากฏเป็นอันดับแรก (ในรายการของฉันอยู่ดี) และเวลาที่ผ่านมามีโอกาสใดบ้างที่คุณจะเต็มใจเพิ่มคำตอบของคุณเพื่อรวมการสนทนาเกี่ยวกับประเภท BIT บน MySQL 5.1 และ ต่อมา?
Jonathan

3
@ โจนาธานบางทีการพูดถึงมันมีค่า แต่ BIT (1) ไม่ได้ใช้พื้นที่น้อยกว่า TINYINT (1) และไม่ได้แสดงอย่างที่คนส่วนใหญ่คาดหวังเมื่อใช้คอนโซล mysql มาตรฐาน เนื่องจากข้อเสียดังกล่าวและไม่มีประโยชน์ในการจัดเก็บเพียงแค่ใช้ TINYINT (1) หรือ BOOLEAN ดูเหมือนจะเป็นเรื่องธรรมดาที่สุดในประสบการณ์ของฉัน
Tyler Smith

31

หมายเหตุสำหรับนักพัฒนา php (ฉันไม่มีจุด stackoverflow ที่จำเป็นในการโพสต์สิ่งนี้เป็นความคิดเห็น) ... การแปลงแบบอัตโนมัติ (และไม่โต้ตอบ) เป็น TINYINT หมายความว่า php ดึงค่าจากคอลัมน์ "BOOLEAN" เป็น "0" หรือ "1" ไม่ใช่ที่ฉันคาดไว้ (โดยฉัน) จริง / เท็จ

นักพัฒนาที่กำลังดู SQL ที่ใช้ในการสร้างตารางและเห็นบางสิ่งเช่น "some_boolean BOOLEAN NOT NULL DEFAULT FALSE" อาจคาดหวังว่าจะเห็นผลลัพธ์จริง / เท็จเมื่อมีการเรียกข้อมูลแถวที่มีคอลัมน์นั้น แทน (อย่างน้อยใน PHP เวอร์ชันของฉัน) ผลลัพธ์จะเป็น "0" หรือ "1" (ใช่สตริง "0" หรือสตริง "1" ไม่ใช่ int 0/1 ขอบคุณ php)

เป็นเรื่องเล็กน้อย แต่เพียงพอที่จะทำให้การทดสอบหน่วยล้มเหลว


2
หมายเหตุเพิ่มเติมไดรเวอร์ mysql ของ PHP ดึงประเภทจำนวนเต็มทั้งหมดเป็นสตริง
kojow7

24

ตัวใหม่ล่าสุดรุ่น MySQL ใหม่ที่มีBITชนิดของข้อมูลในที่ที่คุณสามารถระบุจำนวนบิตในสาขาเช่นBIT(1)การใช้เป็นBooleanชนิดเพราะมันสามารถมีได้เพียงหรือ01


7

ตามการอ้างอิงเวอร์ชัน MySql 5.1

BIT(M) =  approximately (M+7)/8 bytes, 
BIT(1) =  (1+7)/8 = 1 bytes (8 bits)

================================================== =======================

TINYINT(1) take 8 bits.

https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html#data-types-storage-reqs-numeric


1
ข้อมูลอ้างอิงของคุณระบุว่าพื้นที่จัดเก็บข้อมูลที่ต้องการคือ "ประมาณ (M + 7) / 8 ไบต์" กล่าวคือมันจะปัดเศษเป็นไบต์เต็มถัดไป ดังนั้นจึงไม่ใช้เวลา 1 บิต
mpen

3

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

ดูที่นี่: https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html

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