Kebingungan BOOLEAN atau TINYINT

92

Saya sedang merancang database untuk situs di mana saya perlu menggunakan tipe data boolean untuk menyimpan hanya 2 status, benar atau salah. Saya menggunakan MySQL.
Saat mendesain database menggunakan phpMyAdmin, saya menemukan bahwa saya memiliki tipe data BOOLEAN dan tipe data TINYINT.
Saya membaca artikel yang berbeda, beberapa mengatakan TINYINT sama dengan BOOLEAN, tidak ada perbedaan. Ada yang bilang BOOLEAN diubah menjadi TINYINT di MySQL.

Pertanyaan SAYA adalah, jika keduanya sama mengapa ada dua? Seharusnya hanya ada satu dari mereka.

Berikut referensi artikel yang saya baca:
http://www.careerride.com/MySQL-BOOL-TINYINT-BIT.aspx
http://dev.mysql.com/doc/refman/5.5/en/numeric-type -overview.html

Bipin Chandra Tripathi
sumber

Jawaban:

137

MySQL tidak memiliki tipe data boolean internal. Ini menggunakan tipe data integer terkecil - TINYINT.

BOOLEAN dan BOOL setara dengan TINYINT (1), karena keduanya sinonim.

Cobalah untuk membuat tabel ini -

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

Kemudian jalankan SHOW CREATE TABLE, Anda akan mendapatkan output ini -

CREATE TABLE `table1` (
  `column1` tinyint(1) DEFAULT NULL
)
Devart
sumber
1
Tetapi jawaban Anda benar dalam semua aspek lainnya. Apa yang tampaknya membingungkan OP adalah adanya sinonim.
ypercubeᵀᴹ
2
Tampaknya itu dilakukan untuk kompatibilitas ke belakang. Tipe data BOOLEAN sebelum MySQL 5 dan tipe BIT yang tidak dioptimalkan, juga TINYINT. Dari dokumentasi - Fitur Baru Direncanakan untuk 5.1: Optimalkan jenis BIT untuk mengambil satu bit. (BIT sekarang membutuhkan satu byte; itu diperlakukan sebagai sinonim untuk TINYINT.).
Devart
5
Ya, Anda bisa tahu memiliki BIT(1)atau BIT(17)atau bahkanBIT(64)
ypercubeᵀᴹ
3
@Devart - Di mana jawaban Anda memiliki suara terbanyak dan muncul pertama kali (dalam daftar saya) dan beberapa waktu telah berlalu, adakah kemungkinan Anda bersedia menambahkan jawaban Anda untuk memasukkan beberapa diskusi tentang jenis BIT di MySQL 5.1 dan kemudian?
Jonathan
3
@Jonathan Mungkin menyebutkan itu berharga, namun BIT (1) sebenarnya tidak menggunakan lebih sedikit ruang dari TINYINT (1) dan tidak ditampilkan seperti yang diharapkan kebanyakan orang saat menggunakan konsol mysql standar. Karena sisi negatifnya, dan tidak ada manfaat penyimpanan, hanya menggunakan TINYINT (1) atau BOOLEAN tampaknya yang paling umum dalam pengalaman saya.
Tyler Smith
31

Sekadar catatan untuk pengembang php (saya kekurangan poin stackoverflow yang diperlukan untuk memposting ini sebagai komentar) ... konversi automagic (dan diam) ke TINYINT berarti bahwa php mengambil nilai dari kolom "BOOLEAN" sebagai "0" atau "1", bukan yang diharapkan (oleh saya) benar / salah.

Pengembang yang melihat SQL yang digunakan untuk membuat tabel dan melihat sesuatu seperti: "some_boolean BOOLEAN NOT NULL DEFAULT FALSE", mungkin cukup berharap untuk melihat hasil benar / salah ketika baris yang berisi kolom itu diambil. Sebaliknya (setidaknya dalam versi PHP saya), hasilnya adalah "0" atau "1" (ya, string "0" atau string "1", bukan int 0/1, terima kasih php).

Ini nit, tapi cukup untuk menyebabkan tes unit gagal.

Tom Stambaugh
sumber
2
Sebagai catatan tambahan, driver mysql PHP menarik semua tipe integer sebagai string.
kojow7
24

Versi MySQL Terbaru memiliki BITtipe data baru di mana Anda dapat menentukan jumlah bit di lapangan, misalnya BIT(1)untuk digunakan sebagai Booleantipe, karena bisa saja 0atau 1.

Please_Dont_Bully_Me_SO_Lords
sumber
7

Pada referensi versi MySql 5.1

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

nasib
sumber
1
Referensi Anda mengatakan bahwa penyimpanan yang dibutuhkan sebenarnya "kira-kira (M + 7) / 8 byte". yaitu, pembulatan ke byte penuh berikutnya. Jadi tidak butuh 1 bit.
mpen