BOOLEAN veya TINYINT kafa karışıklığı


93

Doğru veya yanlış olmak üzere yalnızca 2 durumu depolamak için bir boolean veri türü kullanmam gereken bir site için bir veritabanı tasarlıyordum. MySQL kullanıyorum.
Veritabanını phpMyAdmin kullanarak tasarlarken, hem BOOLEAN veri türüne hem de TINYINT veri türüne sahip olduğumu buldum.
Farklı makaleler inceledim, bazıları TINYINT'in BOOLEAN ile aynı olduğunu söyledi, fark yok. Bazıları BOOLEAN'ın MySQL'de TINYINT'e dönüştürüldüğünü söylüyor.

Sorum şu, eğer ikisi de aynıysa neden iki tane var? Sadece biri olmalı.

Okuduğum makalelerin referansı:
http://www.careerride.com/MySQL-BOOL-TINYINT-BIT.aspx
http://dev.mysql.com/doc/refman/5.5/en/numeric-type -overview.html

Yanıtlar:


137

MySQL'in dahili boole veri türü yoktur. En küçük tam sayı veri türünü kullanır - TINYINT.

BOOLEAN ve BOOL, TINYINT (1) 'in eşdeğerleridir, çünkü bunlar eşanlamlıdır.

Bu tabloyu oluşturmaya çalışın -

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

Ardından SHOW CREATE TABLE komutunu çalıştırın, bu çıktıyı alacaksınız -

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

1
Ancak cevabınız diğer tüm açılardan doğrudur. OP ile kafa karıştırıcı görünen şey, eş anlamlıların varlığıdır.
ypercubeᵀᴹ

2
Geriye dönük uyumluluk için yapılmış gibi görünüyor. BOOLEAN veri türü MySQL 5'ten önceydi ve optimize edilmemiş BIT türü, aynı zamanda TINYINT idi. Dokümantasyondan - 5.1 için Planlanan Yeni Özellikler: BIT tipini bir bit alacak şekilde optimize edin. (BIT artık bir bayt alır; TINYINT ile eşanlamlı olarak kabul edilir.).
Devart

5
Evet, var BIT(1)ya BIT(17)da hattaBIT(64)
ypercubeᵀᴹ

3
@Devart - Cevabınızın en çok oyu aldığı ve ilk olarak göründüğü (yine de listemde) ve bir süre geçtiği yerde, MySQL 5.1'deki BIT türü tartışmalarını dahil etmek için cevabınıza eklemek isteyeceğiniz herhangi bir şans var mı ve sonra?
Jonathan

3
@Jonathan Belki de değerlidir, ancak BIT (1) aslında TINYINT (1) 'den daha az yer kullanmaz ve standart mysql konsolunu kullanırken çoğu insanın beklediği gibi görüntülenmez. Bu dezavantajı ve depolama avantajı olmaması nedeniyle, deneyimlerime göre sadece TINYINT (1) veya BOOLEAN kullanmak en yaygın olanı gibi görünüyor.
Tyler Smith

31

Sadece php geliştiricileri için bir not (bunu bir yorum olarak göndermek için gerekli yığın aşımı noktalarına sahip değilim) ... TINYINT'e otomatik (ve sessiz) dönüşüm, php'nin bir "BOOLEAN" sütunundan bir değeri "0" veya "1", beklenen değil (benim tarafımdan) doğru / yanlış.

Bir tablo oluşturmak için kullanılan SQL'e bakan ve şöyle bir şey gören bir geliştirici: "some_boolean BOOLEAN NOT NULL DEFAULT FALSE", bu sütunu içeren bir satır alındığında doğru / yanlış sonuçları görmeyi makul bir şekilde bekleyebilir. Bunun yerine (en azından benim PHP sürümümde), sonuç "0" veya "1" olacaktır (evet, "0" dizesi veya "1" dizisi, int 0/1 değil, teşekkürler php).

Bu bir nit, ancak birim testlerinin başarısız olmasına neden olacak kadar.


2
Ek bir not olarak, PHP'nin mysql sürücüleri tüm tam sayı türlerini dizge olarak çeker.
kojow7

24

En Yeni MySQL Sürümleri BIT, alandaki bit sayısını belirleyebileceğiniz yeni veri türüne sahiptir, örneğin tür BIT(1)olarak kullanmak için Boolean, çünkü yalnızca 0veya olabilir 1.


7

MySql 5.1 sürüm referansı itibariyle

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
Referansınız, gereken depolamanın aslında "yaklaşık (M + 7) / 8 bayt" olduğunu söylüyor. yani, bir sonraki tam bayta yuvarlanır. Böylece gelmez değil 1 biraz alır.
mpen

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.