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

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
)

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.


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.


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


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.