MySQL'deki boole değerleri için Boole ve tinyint (1)


124

MySQL veritabanında boole değerleri için en iyi sütun türü hangisidir? Ben kullanıyorum booleanama meslektaşım kullanıyor tinyint(1).


3
Görünüşe göre MySQL şeffaf bir booleanşekilde tinyint(1). Kullanabileceğiniz Yani boolean, trueve falseolarak ve MySQL davranır onları tinyint(1), 1ve 0.
ADTC

Diğer bir durum, bazı insanlar tarafından daha hızlı olması beklenen Y & N'li char 1'dir.
Zon

Yanıtlar:


153

Bu veri türleri eşanlamlıdır.


6
Veri türlerinin eşanlamlı olduğunu söyleyemem - tinyint (1) bool ile aynıdır, ancak tinyint ve bool aynı değildir. Önemsiz bir nokta, ama cevabınız onu ilk okuduğumda beni
heyecanlandırdı

2
Bu soruya cevap vermiyor. Tinyint (1) 'in işlevsel olarak bool ile aynı olduğu doğru olsa da, OP en iyi neyin kullanılacağını sordu. @Dj_segfault'un cevabı, bir boole değerini depolarken neden tinyint (1) yerine bool'un tercih edilmesi gerektiğini açıklayan uygun bir iş çıkarır.
Kyle Morgan

88

Burada farklı bir yaklaşım benimseyeceğim ve geliştirici arkadaşlarınızın kodunuzu anlamalarının derleyici / veritabanı için olduğu kadar önemli olduğunu önereceğim. Boole kullanmak, tinyint kullanmakla aynı şeyi yapabilir, ancak niyetinizin ne olduğunu anlamsal olarak iletme avantajına sahiptir ve bu bir şeye değer.

Küçük bir değer kullanırsanız, görmeniz gereken değerlerin 0 ve 1 olduğu açık değildir. Boole HER ZAMAN doğru veya yanlıştır.


35

booleanMySQL'de farklı bir veri türü değildir; sadece eşanlamlısı tinyint. MySQL kılavuzundaki bu sayfaya bakın .

Şahsen ben minicint'i bir tercih olarak kullanmanızı öneririm, çünkü boolean adından yaptığını düşündüğünüz şeyi yapmaz, bu yüzden potansiyel olarak yanıltıcı kod yapar. Ancak pratik düzeyde, gerçekten önemli değil - ikisi de aynı şeyi yapıyor, yani ikisini de kullanarak hiçbir şey kazanmıyor veya kaybetmiyorsunuz.


8

enum kullanın , en kolay ve en hızlısı

minikint (1) 8 bite ihtiyaç duyarken, bit (1) boole değerini depolamak için yalnızca 1 bit gerektiğinden, enum veya tinyint (1) 'i önermeyeceğim.

ref

MySQL'deki boole değerleri için TINYINT - ENUM (0, 1)


Veritabanımızın da sqlite'ı desteklemesi gerektiğinden enum kullanamıyoruz
tom

11
InnoDB kullanıyorsanız, bit, tinyint kadar çok alan kullanır. Gönderen Yüksek Performanslı MySQL (Percona adamlar) "InnoDB'nin mağaza herhangi depolama alanı tasarruf değil bu yüzden en küçük tamsayı tipi yeterince büyük olarak her [bit] sütununda, bit içerdiği [s]." Tek kazanç, bir BIT (1'den fazla) sütununda birden çok boole değeri depoluyor olmanızdır. Dolayısıyla, yalnızca bir boole alanınız varsa, tinyint kullanmak InnoDB'deki bit ile aynıdır ve tinyint ile çalışmak genellikle daha kolay olduğu için tercih edilir.
billmalarky

MySQL için doğru değil: BIT(M) - approximately (M+7)/8 bytesbkz: dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
Jens

6

Bunun doğru olsa boolve tinyint(1)vardır işlevsel özdeş, boolbunu yapmaya çalışıyoruz ne semantik anlam taşır, çünkü tercih edilmelidir. Ayrıca, birçok ORM, boolprogramlama dilinizin yerel boole türüne dönüşecektir.


0

Kullanarak Benim deneyim Dapper bağlanmak için MySQL olmasıdır fark eder . Aşağıdaki betiği kullanarak null yapılamayan bir biti (1) null yapılabilir bir tinyint (1) olarak değiştirdim:

ALTER TABLE TableName MODIFY Setting BOOLEAN null;

Sonra Dapper, İstisnalar atmaya başladı. Senaryodan önceki ve sonraki farka bakmaya çalıştım. Ve bitin (1) tinyint (1) olarak değiştiğini fark ettim.

Sonra koştum:

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

Sorun çözüldü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.