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.
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.
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.
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.
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.
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.
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:
ALTERTABLE 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).
boolean
sebagaitinyint(1)
. Sehingga Anda dapat menggunakanboolean
,true
danfalse
dan memperlakukan MySQL mereka sebagaitinyint(1)
,1
dan0
.Jawaban:
Tipe data ini adalah sinonim.
sumber
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.
sumber
boolean
bukanlah tipe data yang berbeda di MySQL; itu hanya sinonim untuktinyint
. 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.
sumber
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
sumber
BIT(M) - approximately (M+7)/8 bytes
lihat: dev.mysql.com/doc/refman/8.0/en/storage-requirements.htmlMeskipun benar bahwa
bool
dantinyint(1)
secara fungsional identik,bool
harus menjadi pilihan yang disukai karena membawa makna semantik dari apa yang Anda coba lakukan. Selain itu, banyak ORM akan diubahbool
menjadi jenis boolean asli bahasa pemrograman Anda.sumber
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:
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:
Yang memecahkan masalah.
sumber