Boolean vs tinyint (1) untuk nilai boolean di MySQL

124

Jenis kolom apa yang paling baik digunakan dalam database MySQL untuk nilai boolean? Saya menggunakan booleantetapi rekan saya menggunakan tinyint(1).

tom
sumber
3
Tampaknya MySQL transparan memperlakukan booleansebagai tinyint(1). Sehingga Anda dapat menggunakan boolean, truedan falsedan memperlakukan MySQL mereka sebagai tinyint(1), 1dan 0.
ADTC
Kasus lainnya adalah karakter 1 dengan Y&N yang seharusnya lebih cepat oleh sebagian orang.
Zon

Jawaban:

153

Tipe data ini adalah sinonim.

Māris Kiseļovs
sumber
6
Saya tidak akan mengatakan tipe datanya adalah sinonim - tinyint (1) sama dengan bool, tetapi tinyint dan bool tidak sama. Poin kecil, tetapi jawaban Anda membuat saya tersandung saat pertama kali saya membacanya
Kyle Chadha
2
Ini tidak menjawab pertanyaan itu. Meskipun benar bahwa tinyint (1) secara fungsional identik dengan bool, OP menanyakan apa yang terbaik untuk digunakan. Jawaban oleh @dj_segfault melakukan pekerjaan yang benar menjelaskan mengapa bool harus lebih disukai daripada tinyint (1) saat menyimpan nilai boolean.
Kyle Morgan
88

Saya akan mengambil pendekatan berbeda di sini dan menyarankan bahwa sama pentingnya bagi sesama pengembang Anda untuk memahami kode Anda seperti halnya untuk kompiler / database. Menggunakan boolean dapat melakukan hal yang sama seperti menggunakan tinyint, namun memiliki keuntungan untuk menyampaikan maksud Anda secara semantik, dan itu bernilai.

Jika Anda menggunakan tinyint, tidak jelas bahwa satu-satunya nilai yang harus Anda lihat adalah 0 dan 1. Boolean SELALU benar atau salah.

dj_segfault
sumber
35

booleanbukanlah tipe data yang berbeda di MySQL; itu hanya sinonim untuk tinyint. Lihat halaman ini di manual MySQL .

Secara pribadi saya akan menyarankan menggunakan tinyint sebagai preferensi, karena boolean tidak melakukan apa yang Anda pikirkan dari namanya, jadi itu membuat kode yang berpotensi menyesatkan. Tetapi pada tingkat praktis, itu tidak masalah - mereka berdua melakukan hal yang sama, jadi Anda tidak mendapatkan atau kehilangan apa pun dengan menggunakan keduanya.

Spudley
sumber
8

gunakan enum yang paling mudah dan tercepat

saya tidak akan merekomendasikan enum atau tinyint (1) karena bit (1) hanya membutuhkan 1 bit untuk menyimpan nilai boolean sementara tinyint (1) membutuhkan 8 bit.

ref

TINYINT vs ENUM (0, 1) untuk nilai boolean di MySQL

Pramendra Gupta
sumber
Kami tidak dapat menggunakan enum karena database kami juga perlu mendukung sqlite
tom
11
Jika Anda menggunakan InnoDB, bit akhirnya menggunakan ruang sebanyak tinyint. Dari MySQL Kinerja Tinggi (orang-orang percona) "InnoDB menyimpan [s] setiap kolom [bit] sebagai tipe bilangan bulat terkecil yang cukup besar untuk menampung bit, jadi Anda tidak menghemat ruang penyimpanan." Keuntungan satu-satunya adalah jika Anda menyimpan beberapa nilai boolean dalam kolom BIT (lebih dari 1). Jadi jika Anda hanya memiliki satu bidang boolean, penggunaan tinyint sama dengan bit di InnoDB, dan lebih disukai karena tinyint biasanya lebih mudah digunakan.
billmalarky
Tidak benar untuk MySQL: BIT(M) - approximately (M+7)/8 byteslihat: dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
Jens
6

Meskipun benar bahwa booldan tinyint(1)secara fungsional identik, boolharus menjadi pilihan yang disukai karena membawa makna semantik dari apa yang Anda coba lakukan. Selain itu, banyak ORM akan diubah boolmenjadi jenis boolean asli bahasa pemrograman Anda.

Kyle Morgan
sumber
0

Pengalaman saya saat menggunakan Dapper untuk terhubung ke MySQL adalah hal itu penting . Saya mengubah bit non nullable (1) menjadi tinyint nullable (1) dengan menggunakan skrip berikut:

ALTER TABLE TableName MODIFY Setting BOOLEAN null;

Kemudian Dapper mulai melempar Pengecualian. Saya mencoba melihat perbedaan sebelum dan sesudah skrip. Dan perhatikan bit (1) telah berubah menjadi tinyint (1).

Saya kemudian berlari:

ALTER TABLE TableName CHANGE COLUMN Setting Setting BIT(1) NULL DEFAULT NULL;

Yang memecahkan masalah.

smerlung.dll
sumber