MySQL'de BIT ve TINYINT arasındaki fark nedir?


106

Hangi durumlarda hangisini kullanırsınız? Bir çok fark var mı? Boole'leri depolamak için genellikle kalıcılık motorları tarafından hangisini kullandım?

Yanıtlar:


122

TINYINT, 8 bitlik bir tam sayı değeridir, bir BIT alanı 1 bit, BIT (1) ve 64 bit, BIT (64) arasında saklayabilir. Boole değerleri için, BIT (1) oldukça yaygındır.


10
TINYINT ve BIT (8) arasındaki fark nedir?
Pacerier

16
TINYINT imzalı veya işaretsiz olabilir ve negatif sayılarla ilişkilendirilebilir. Bit, verileri imzalamadan sadece bitleri depolar, MSB'yi kendiniz yorumlamanız gerekir.
tanımlar

4
Karışıklığı önlemek için, TINYINT ve BIT (1) 'in Depolama Gereksinimleri açısından farklılık göstermediği ve BOOL ve BOOLEAN'ın TINYINT (1) Sayısal Tip Genel Bakış ile eşanlamlı olduğu eklenmelidir .
Timo Strotmann

59

Gönderen Sayısal Türlerinin Genel Bakış ;

BIT [(M)]

Bir bit alanı türü. M, 1'den 64'e kadar değer başına bit sayısını gösterir. M atlanırsa varsayılan 1'dir.

Bu veri türü MyISAM için MySQL 5.0.3'e eklendi ve 5.0.5'te MEMORY, InnoDB, BDB ve NDBCLUSTER olarak genişletildi. 5.0.3'ten önce, BIT, TINYINT (1) ile eşanlamlıdır.

TINYINT [(M)] [İMZASIZ] [ZEROFILL]

Çok küçük bir tam sayı. İşaretli aralık -128 ila 127'dir. İşaretsiz aralık 0 ila 255'tir.

Ayrıca şunu da göz önünde bulundurun;

BOOL, BOOLE

Bu türler TINYINT (1) ile eşanlamlıdır. Sıfır değeri yanlış kabul edilir. Sıfır olmayan değerler doğru kabul edilir.


12
booleanGerçekten biraz da olsa bir bayt alacağını söylüyorsunuz , yani bir BIT (1) v5.0.3'ten sonra daha iyidir?
Pacerier

3
Evet @Pacerier. Boole, bir sayı alanı için çirkin bir takma addır.
Áxel Costas Pena

7
Gerçek depolamaya gelince, BIT (1) hala minimum bir bayt kaplar. BIT (M) = (M + 7) / 8 bayt. (1 + 7) / 8 = 1 bayt. Sayısal Tip Depolama Gereksinimlerine bakın .
Drazen Bjelovuk

1
Ne yazık ki BOOL/ yerine BOOLEANtakma adlar . Tabii, semantik olarak bir bütün byte karşılık ancak yukarı tüm son çok daha uygun olacaktır. TINYINT(1)BITBIT
MestreLion

38

Tüm bu teorik tartışmalar harikadır, ancak gerçekte, en azından MySQL kullanıyorsanız ve gerçekten SQLServer için, boole'larınız için ikili olmayan verileri kullanmak en iyisidir Verilerin çıktısını alma, sorgulama vb. MySQL ve SQLServer arasında birlikte çalışabilirliği sağlamaya çalışıyorsanız (yani ikisi arasında verileri senkronize ediyorsanız) özellikle önemlidir, çünkü BIT veri türünün işlenmesi ikisinde farklıdır. Yani pratikte sayısal bir veri tipine bağlı kalırsanız çok daha az sorun yaşarsınız. MySQL'in TINYINT (1) olarak saklanan BOOL veya BOOLEAN ile yapışmasını tavsiye ederim. MySQL Workbench ve MySQL Administrator'ın BIT veri tipini görüntüleme şekli bile hoş değil (ikili veriler için küçük bir sembol).


1
Bana göre bazı arayüzlerin vb. Doğru ikili verileri yanlış yorumlaması benim hatam değil. Bir yönetici (kendim dahil) bazı sembollerden (MySQL Wrokbench'e atıfta bulunarak) şikayet ederse, bu, doğru (ikili) verilerimi içerik hakkında hiçbir bilgi vermeyen bir sembol olarak yanlış yorumlayanların hatasıdır. Yani MySQL / Oracle bu hatayı yaptı ve ben programlama konseptimi sadece kimse bir hata yaptığı için değiştirmeye istekli değilim.
Matmarbon

11

BIT yalnızca 0 ve 1'e izin vermelidir (ve alan NOT NULL olarak tanımlanmamışsa NULL). TINYINT (1), işaretsiz olup olmamasına bağlı olarak tek bir bayt, -128..127 veya 0..255 olarak saklanabilen herhangi bir değere izin verir (1, yalnızca tek bir rakam kullanmayı düşündüğünüzü gösterir, ancak daha büyük bir değer kaydetmenizi engellemez).

5.0.3 daha eski sürümler için BIT böylece var, TINYINT (1) olarak yorumlanır hiçbir orada farkı.

BIT'de "bu bir boolean" semantik vardır ve bazı uygulamalar TINYINT (1) 'i aynı şekilde dikkate alır (MySQL'in bunu işleme şekli nedeniyle), bu nedenle uygulamalar, türü kontrol ederlerse sütunu bir onay kutusu olarak biçimlendirebilirler ve buna göre bir formata karar verin.


4

Yanlış olabilir ama:

Tinyint, 0 ile 255 arasında bir tam sayıdır

bit 1 veya 0'dır

Bu nedenle bana göre biraz mantıksal seçim


Üzgünüm burada T_SQL'de olduğumuzu düşündüm, bu yüzden bilmiyorum
Allen Hardy

0

Tecrübelerime dayanarak size BIT'in linux işletim sistemi türlerinde (örneğin Ubuntu) sorunları olduğunu söylüyorum. Veritabanımı pencerelerde geliştirdim ve her şeyi linux üzerinde konuşlandırdıktan sonra, BIT DATA TYPE olan tablolardan eklenen veya seçilen sorgularla ilgili sorunlar yaşadım.

Bit şimdilik güvenli değil. Tinyint (1) olarak değiştirdim ve mükemmel çalıştım. Demek istediğim, sadece 1 mi yoksa 0 mı olduğunu ayırt etmek için bir değere ihtiyacınız var ve tinyint (1) bunun için uygun

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.