Boolean vs tinyint (1) สำหรับค่าบูลีนใน MySQL


124

คอลัมน์ประเภทใดที่ดีที่สุดที่จะใช้ในฐานข้อมูล MySQL สำหรับค่าบูลีน ผมใช้แต่ใช้เพื่อนร่วมงานของฉันbooleantinyint(1)


3
ดูเหมือนว่า MySQL จะถือว่าbooleanเป็นtinyint(1)ไฟล์. ดังนั้นคุณสามารถใช้boolean, trueและfalseและ MySQL ถือว่าพวกเขาเป็นtinyint(1), และ1 0
ADTC

อีกกรณีหนึ่งคือถ่าน 1 กับ Y & N ซึ่งบางคนน่าจะเร็วกว่า
Zon

คำตอบ:


153

ชนิดข้อมูลเหล่านี้เป็นคำพ้องความหมาย


6
ฉันจะไม่บอกว่าประเภทข้อมูลเป็นคำพ้องความหมาย - tinyint (1) เหมือนกับบูล แต่ tinyint และ bool ไม่เหมือนกัน ประเด็นเล็กน้อย แต่คำตอบของคุณทำให้ฉันสะดุดในครั้งแรกที่อ่าน
Kyle Chadha

2
นี่ไม่ได้ตอบคำถาม แม้ว่าจะเป็นความจริงที่ว่า tinyint (1) มีหน้าที่เหมือนกับบูล แต่ OP ก็ถามว่าอะไรดีที่สุดที่จะใช้ คำตอบโดย @dj_segfault อธิบายได้อย่างถูกต้องว่าเหตุใดจึงควรเลือกบูลมากกว่า Tinyint (1) เมื่อจัดเก็บค่าบูลีน
Kyle Morgan

88

ฉันจะใช้แนวทางที่แตกต่างออกไปที่นี่และขอแนะนำว่าการทำความเข้าใจโค้ดของคุณเป็นสิ่งสำคัญสำหรับนักพัฒนาคนอื่น ๆ เช่นเดียวกับคอมไพเลอร์ / ฐานข้อมูล การใช้บูลีนอาจทำสิ่งเดียวกับการใช้ Tinyint อย่างไรก็ตามมันมีข้อดีในการถ่ายทอดความหมายตามความตั้งใจของคุณและนั่นก็คุ้มค่ากับบางสิ่ง

หากคุณใช้ Tinyint จะไม่ชัดเจนว่าค่าเดียวที่คุณควรเห็นคือ 0 และ 1 บูลีนเป็นจริงหรือเท็จเสมอ


35

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

โดยส่วนตัวแล้วฉันขอแนะนำให้ใช้ tinyint เป็นค่ากำหนดเนื่องจากบูลีนไม่ได้ทำในสิ่งที่คุณคิดจากชื่อดังนั้นจึงทำให้โค้ดที่อาจทำให้เข้าใจผิดได้ แต่ในระดับที่ใช้งานได้จริงมันไม่สำคัญเลย - ทั้งคู่ทำสิ่งเดียวกันดังนั้นคุณจะไม่ได้รับหรือสูญเสียอะไรจากการใช้อย่างใดอย่างหนึ่ง


8

ใช้enumมันง่ายและเร็วที่สุด

ฉันจะไม่แนะนำ enum หรือ tinyint (1) เนื่องจากบิต (1) ต้องการเพียง 1 บิตสำหรับเก็บค่าบูลีนในขณะที่ tinyint (1) ต้องการ 8 บิต

อ้าง

TINYINT เทียบกับ ENUM (0, 1) สำหรับค่าบูลีนใน MySQL


เราไม่สามารถใช้ enum ได้เนื่องจากฐานข้อมูลของเราต้องรองรับ sqlite ด้วย
พรุ่งนี้

11
หากคุณใช้ InnoDB บิตจะใช้พื้นที่มากพอ ๆ กับขนาดเล็ก จากHigh Performance MySQL (พวก percona) "InnoDB จัดเก็บ [s] แต่ละคอลัมน์ [bit] เป็นจำนวนเต็มที่เล็กที่สุดที่มีขนาดใหญ่พอที่จะมีบิตดังนั้นคุณจะไม่ประหยัดพื้นที่จัดเก็บใด ๆ " กำไรเพียงอย่างเดียวคือถ้าคุณจัดเก็บค่าบูลีนหลายค่าในคอลัมน์ BIT (morethan1) ดังนั้นหากคุณมีฟิลด์บูลีนเพียงช่องเดียวการใช้ tinyint จะเหมือนกับบิตใน InnoDB และเป็นที่นิยมมากกว่าเนื่องจากโดยทั่วไปแล้ว tinyint จะทำงานได้ง่ายกว่า
billmalarky

ไม่เป็นความจริงสำหรับ MySQL: BIT(M) - approximately (M+7)/8 bytesดู: dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
Jens

6

ในขณะที่มันเป็นความจริงที่boolและtinyint(1)มีหน้าที่เหมือนboolที่ควรจะเป็นตัวเลือกที่ต้องการเพราะมันแบกความหมายของสิ่งที่คุณกำลังพยายามที่จะทำ นอกจากนี้ ORM จำนวนมากจะแปลงboolเป็นประเภทบูลีนดั้งเดิมของภาษาโปรแกรมของคุณ


0

ประสบการณ์ของฉันเมื่อใช้Dapperเพื่อเชื่อมต่อกับMySQLคือว่ามันไม่สำคัญ ฉันเปลี่ยนบิตที่ไม่เป็นโมฆะ (1) เป็น Tinyint ที่ว่างเปล่า (1) โดยใช้สคริปต์ต่อไปนี้:

ALTER TABLE TableName MODIFY Setting BOOLEAN null;

จากนั้น Dapper ก็เริ่มโยนข้อยกเว้น ฉันพยายามมองความแตกต่างก่อนและหลังบท และสังเกตเห็นบิต (1) เปลี่ยนเป็น tinyint (1)

จากนั้นฉันก็วิ่ง:

ALTER TABLE TableName CHANGE COLUMN Setting Setting BIT(1) NULL DEFAULT NULL;

ซึ่งแก้ปัญหาได้.

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