คอลัมน์ประเภทใดที่ดีที่สุดที่จะใช้ในฐานข้อมูล MySQL สำหรับค่าบูลีน ผมใช้แต่ใช้เพื่อนร่วมงานของฉันboolean
tinyint(1)
คอลัมน์ประเภทใดที่ดีที่สุดที่จะใช้ในฐานข้อมูล MySQL สำหรับค่าบูลีน ผมใช้แต่ใช้เพื่อนร่วมงานของฉันboolean
tinyint(1)
คำตอบ:
ชนิดข้อมูลเหล่านี้เป็นคำพ้องความหมาย
ฉันจะใช้แนวทางที่แตกต่างออกไปที่นี่และขอแนะนำว่าการทำความเข้าใจโค้ดของคุณเป็นสิ่งสำคัญสำหรับนักพัฒนาคนอื่น ๆ เช่นเดียวกับคอมไพเลอร์ / ฐานข้อมูล การใช้บูลีนอาจทำสิ่งเดียวกับการใช้ Tinyint อย่างไรก็ตามมันมีข้อดีในการถ่ายทอดความหมายตามความตั้งใจของคุณและนั่นก็คุ้มค่ากับบางสิ่ง
หากคุณใช้ Tinyint จะไม่ชัดเจนว่าค่าเดียวที่คุณควรเห็นคือ 0 และ 1 บูลีนเป็นจริงหรือเท็จเสมอ
boolean
ไม่ใช่ประเภทข้อมูลที่แตกต่างกันใน MySQL tinyint
มันเป็นเพียงคำพ้องความหมายสำหรับ ดูหน้านี้ในคู่มือของ MySQL
โดยส่วนตัวแล้วฉันขอแนะนำให้ใช้ tinyint เป็นค่ากำหนดเนื่องจากบูลีนไม่ได้ทำในสิ่งที่คุณคิดจากชื่อดังนั้นจึงทำให้โค้ดที่อาจทำให้เข้าใจผิดได้ แต่ในระดับที่ใช้งานได้จริงมันไม่สำคัญเลย - ทั้งคู่ทำสิ่งเดียวกันดังนั้นคุณจะไม่ได้รับหรือสูญเสียอะไรจากการใช้อย่างใดอย่างหนึ่ง
ใช้enumมันง่ายและเร็วที่สุด
ฉันจะไม่แนะนำ enum หรือ tinyint (1) เนื่องจากบิต (1) ต้องการเพียง 1 บิตสำหรับเก็บค่าบูลีนในขณะที่ tinyint (1) ต้องการ 8 บิต
อ้าง
BIT(M) - approximately (M+7)/8 bytes
ดู: dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
ในขณะที่มันเป็นความจริงที่bool
และtinyint(1)
มีหน้าที่เหมือนbool
ที่ควรจะเป็นตัวเลือกที่ต้องการเพราะมันแบกความหมายของสิ่งที่คุณกำลังพยายามที่จะทำ นอกจากนี้ ORM จำนวนมากจะแปลงbool
เป็นประเภทบูลีนดั้งเดิมของภาษาโปรแกรมของคุณ
ประสบการณ์ของฉันเมื่อใช้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;
ซึ่งแก้ปัญหาได้.
boolean
เป็นtinyint(1)
ไฟล์. ดังนั้นคุณสามารถใช้boolean
,true
และfalse
และ MySQL ถือว่าพวกเขาเป็นtinyint(1)
, และ1
0