Apa perbedaan antara BIT dan TINYINT di MySQL?

106

Dalam kasus apa Anda akan menggunakan yang mana? Apakah ada banyak perbedaan? Yang biasanya saya gunakan oleh mesin persistensi untuk menyimpan boolean?

pembawa
sumber

Jawaban:

122

TINYINT adalah nilai integer 8-bit, bidang BIT dapat menyimpan antara 1 bit, BIT (1), dan 64 bit, BIT (64). Untuk nilai boolean, BIT (1) cukup umum.

Robert Gamble
sumber
10
apa perbedaan antara TINYINT dan BIT (8)?
Pacerier
16
TINYINT dapat ditandatangani atau tidak dan berhubungan dengan angka negatif. Bit hanya menyimpan bit tanpa menandatangani data, Anda tinggal menafsirkan MSB sendiri.
menentukan
4
Untuk menghindari kebingungan, harus ditambahkan bahwa TINYINT dan BIT (1) tidak berbeda dalam Persyaratan Penyimpanannya dan bahwa BOOL dan BOOLEAN adalah sinonim untuk TINYINT (1) Gambaran Umum Jenis Numerik .
Timo Strotmann
59

Dari Gambaran Umum Jenis Numerik ;

BIT [(M)]

Jenis bit-field. M menunjukkan jumlah bit per nilai, dari 1 hingga 64. Standarnya adalah 1 jika M dihilangkan.

Jenis data ini ditambahkan di MySQL 5.0.3 untuk MyISAM, dan diperpanjang di 5.0.5 menjadi MEMORY, InnoDB, BDB, dan NDBCLUSTER. Sebelum 5.0.3, BIT adalah sinonim untuk TINYINT (1).

TINYINT [(M)] [TIDAK DITANDATANGANI] [ZEROFILL]

Bilangan bulat yang sangat kecil. Rentang bertanda tangan adalah -128 hingga 127. Rentang unsigned adalah 0 hingga 255.

Pertimbangkan juga ini;

BOOL, BOOLEAN

Jenis ini adalah sinonim untuk TINYINT (1). Nilai nol dianggap salah. Nilai bukan nol dianggap benar.

Nelson Miranda
sumber
12
Anda mengatakan itu booleanakan memakan waktu satu byte meskipun sebenarnya hanya sedikit, jadi BIT (1) lebih baik setelah v5.0.3?
Pacerier
3
Ya @Perier. Boolean hanyalah alias jelek untuk bidang angka.
Áxel Costas Pena
7
Sejauh penyimpanan sebenarnya, BIT (1) masih menempati minimal satu byte. BIT (M) = (M + 7) / 8 byte. (1 + 7) / 8 = 1 byte. Lihat Persyaratan Penyimpanan Jenis Numerik .
Drazen Bjelovuk
1
Sedih karena BOOL/ BOOLEANadalah alias TINYINT(1)bukan BIT. Tentu, mereka semua akhirnya menempati seluruh byte, tetapi secara semantik BITakan jauh lebih tepat.
MestreLion
38

Semua diskusi teoretis ini bagus, tetapi pada kenyataannya, setidaknya jika Anda menggunakan MySQL dan benar-benar untuk SQLServer juga, yang terbaik adalah tetap menggunakan data non-biner untuk boolean Anda karena alasan sederhana sehingga lebih mudah untuk digunakan saat Anda mengeluarkan data, melakukan kueri, dan sebagainya. Ini sangat penting jika Anda mencoba untuk mencapai interoperabilitas antara MySQL dan SQLServer (yaitu Anda menyinkronkan data di antara keduanya), karena penanganan tipe data BIT berbeda di keduanya. SO dalam praktiknya Anda akan memiliki lebih sedikit kerepotan jika Anda tetap menggunakan tipe data numerik. Saya akan merekomendasikan MySQL untuk tetap menggunakan BOOL atau BOOLEAN yang disimpan sebagai TINYINT (1). Bahkan cara MySQL Workbench dan MySQL Administrator menampilkan tipe data BIT tidak bagus (ini adalah simbol kecil untuk data biner).

Sheldmandu
sumber
1
Menurut pendapat saya, ini bukan kesalahan saya, bahwa beberapa antarmuka, dll. Tidak menafsirkan data biner yang benar dengan benar. Jika seorang administrator (termasuk saya) mengeluh tentang beberapa simbol (mengacu pada MySQL Wrokbench) maka ini adalah kesalahan siapa pun yang salah menafsirkan data (biner) saya yang benar sebagai simbol yang tidak memberikan informasi tentang konten. Jadi MySQL / Oracle membuat kesalahan dan saya tidak bersedia mengubah konsep pemrograman saya hanya karena ada yang melakukan kesalahan.
Matmarbon
11

BIT seharusnya hanya mengizinkan 0 dan 1 (dan NULL, jika field tidak didefinisikan sebagai NOT NULL). TINYINT (1) memungkinkan nilai apa pun yang dapat disimpan dalam satu byte, -128..127 atau 0..255 tergantung apakah unsigned atau tidak (1 menunjukkan bahwa Anda bermaksud untuk hanya menggunakan satu digit, tetapi tidak tidak mencegah Anda menyimpan nilai yang lebih besar).

Untuk versi yang lebih lama dari 5.0.3, BIT diartikan sebagai TINYINT (1), jadi tidak ada perbedaan di sana.

BIT memiliki semantik "ini adalah boolean", dan beberapa aplikasi akan mempertimbangkan TINYINT (1) dengan cara yang sama (karena cara MySQL dulu memperlakukannya), jadi aplikasi dapat memformat kolom sebagai kotak centang jika mereka mencentang jenisnya dan memutuskan format berdasarkan itu.

Michael Madsen
sumber
4

Mungkin salah tapi:

Tinyint adalah bilangan bulat antara 0 dan 255

bit adalah 1 atau 0

Oleh karena itu bagi saya bit adalah pilihan untuk boolean

Allen Hardy
sumber
Maaf mengira kami menggunakan T_SQL di sini jadi oleh karena itu saya tidak tahu
Allen Hardy
0

Dari pengalaman saya, saya memberi tahu Anda bahwa BIT memiliki masalah pada jenis OS linux (Ubuntu untuk ex). Saya mengembangkan db saya di windows dan setelah saya menerapkan semuanya di linux, saya mengalami masalah dengan kueri yang dimasukkan atau dipilih dari tabel yang memiliki JENIS DATA BIT.

Bit tidak aman untuk saat ini. Saya berubah menjadi tinyint (1) dan bekerja dengan sempurna. Maksud saya, Anda hanya perlu nilai untuk membedakan jika 1 atau 0 dan tinyint (1) tidak apa-apa untuk itu

AndreiTiberiu
sumber