Jenis data MySQL mana yang digunakan untuk menyimpan nilai boolean

1208

Karena MySQL sepertinya tidak memiliki tipe data 'boolean', tipe data mana yang Anda 'penyalahgunaan' untuk menyimpan informasi benar / salah di MySQL?

Terutama dalam konteks menulis dan membaca dari / ke skrip PHP.

Seiring waktu saya telah menggunakan dan melihat beberapa pendekatan:

  • tinyint, bidang varchar yang berisi nilai 0/1,
  • bidang varchar yang berisi string '0' / '1' atau 'benar' / 'salah'
  • dan akhirnya enum Fields yang berisi dua opsi 'benar' / 'salah'.

Tidak satu pun di atas yang tampak optimal. Saya cenderung lebih suka varian tinyint 0/1, karena konversi tipe otomatis dalam PHP memberi saya nilai boolean lebih sederhana.

Jadi tipe data apa yang Anda gunakan? Apakah ada tipe yang dirancang untuk nilai boolean yang saya abaikan? Apakah Anda melihat kelebihan / kekurangan dengan menggunakan satu jenis atau lainnya?

Peter Mortensen
sumber
217
Siapa pun yang membaca jawaban lama untuk pertanyaan ini perlu memahami bahwa MySQL menambahkan sedikit tipe data dalam versi 5. Gunakan informasi itu sebanyak mungkin. dev.mysql.com/doc/refman/5.0/id/bit-type.html
smp7d
3
Pertanyaan terkait dengan Alternatif untuk banyak boolean di MySQL?
tereško
7
untuk versi MYSQL Boolean versi saat ini tersedia- dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html periksa ini. menurut nilai itu nol dianggap sebagai salah
DevT
7
bit(1)Agak ** untuk mengimpor dalam Excel. Beralih ke tinyint(1)pekerjaan.
Cees Timmerman
8
sekarang kami memiliki boolean setelah 5 tahun
V-SHY

Jawaban:

1232

Untuk MySQL 5.0.3 dan lebih tinggi, Anda bisa menggunakan BIT. Manual mengatakan:

Pada MySQL 5.0.3, tipe data BIT digunakan untuk menyimpan nilai bit-field. Jenis BIT (M) memungkinkan penyimpanan nilai M-bit. M dapat berkisar dari 1 hingga 64.

Jika tidak, menurut manual MySQL Anda dapat menggunakan bool dan boolean yang saat ini alias tinyint (1):

Bool, Boolean: Jenis-jenis ini adalah sinonim untuk TINYINT (1). Nilai nol dianggap salah. Nilai bukan nol dianggap benar.

MySQL juga menyatakan bahwa:

Kami bermaksud untuk menerapkan penanganan tipe boolean penuh, sesuai dengan SQL standar, dalam rilis MySQL mendatang.

Referensi: http://dev.mysql.com/doc/refman/5.5/id/numeric-type-overview.html

markus
sumber
11
Ya, saya akan memilih ini atau, untuk CHAR (1) dan menyimpan 'Y' / 'N' atau 'T' / 'F' dll tergantung pada konteksnya. Keuntungan menggunakan tipe integer kecil adalah Anda mendapatkan portabilitas maksimum di RDBMS-es
Roland Bouman
36
Going for char, setidaknya dalam PHP, akan menghasilkan lebih banyak kode karena !$booleantidak akan pernah mengevaluasi dengan baik tanpa pemrosesan lebih lanjut.
Mild Fuzz
10
@Pecerier Tidak ada yang tidak bisa Anda google sendiri, tapi ok, saya akan gigit. Pertama-tama, silakan lihat data0type.h. Harap dicatat bahwa innodb tidak secara alami mendefinisikan tipe BIT di sana. Jika itu akan memperlakukan bidang BIT dengan cara yang Anda gambarkan, pasti kami akan menemukan beberapa petunjuk keberadaannya di sana. Kedua, baca mysqlperformanceblog.com/2008/04/23/… . Dan jangan ragu untuk memberi tahu kami klien MySQL mana yang luar biasa di "marktetplace" yang cocok dengan bidang BIT. Mereka akan berguna bagi siapa pun yang tidak terjawab artikel itu.
Roland Bouman
9
Ketika saya melakukan pilih dari bidang bit klien baris perintah mysql standar muncul sepenuhnya kosong. Karena itu saya lebih suka TINYINT (1).
Pengguna
8
@MikePurcell Saya benci bertanya tetapi mengapa Anda ingin auto_incrementpada kolom yang mewakili nilai boolean?
Chris Hayes
248

BOOLdan BOOLEANmerupakan sinonim dari TINYINT(1). Nol adalah false, yang lainnya true. Informasi lebih lanjut di sini .

Philip Morton
sumber
7
Tidak (1)lebih dari menentukan bagaimana nilai ditampilkan, jika Anda sadar tentang ukuran penyimpanan maka Anda ingin menggunakan BITsebagai gantinya
JamesHalsall
35
@JamesHalsall: Sebenarnya, BIT(1)dan TINYINT(1)keduanya akan menggunakan satu byte penyimpanan. Hingga MySQL 5.0.3, BITsebenarnya adalah sinonim untuk TINYINT. Kemudian versi MySQL mengubah implementasi BIT. Tetapi bahkan dengan perubahan implementasi, masih tidak ada "ukuran penyimpanan" manfaat untuk BITtipe data (setidaknya dengan InnoDB dan MyISAM; mesin penyimpanan lain misalnya NDB mungkin memiliki beberapa optimasi penyimpanan untuk beberapa deklarasi kolom BIT.) Masalah yang lebih besar adalah bahwa beberapa klien perpustakaan tidak mengenali atau menangani BITkolom tipe data yang dikembalikan dengan tepat . A TINYINTbekerja lebih baik.
spencer7593
5
Manual MySQL 5.0 dengan jelas mengatakan bahwa nilai boolean adalah 1 atau 0. Frasa "apa pun itu true" tidak benar.
Walter
7
@Walter: Sebenarnya agak benar, penjelasannya agak kurang. Secara singkat, dalam konteks boolean, ekspresi dapat dievaluasi menjadi NULL, FALSE atau TRUE. Dalam pernyataan MySQL, ekspresi yang dievaluasi dalam konteks boolean pertama kali dievaluasi sebagai integer (nilai desimal dan float dibulatkan, string dikonversi dengan cara unik yang biasa MySQL mengubah string menjadi integer). NULL adalah NULL (TIDAK BENAR atau SALAH). Nilai integer 0 ditangani sebagai SALAH, dan setiap nilai integer lainnya (1, 2, -7, dll) mengevaluasi ke TRUE. Untuk kompatibilitas, kami meniru logika / penanganan TINYINT boolean
spencer7593
4
@Walter: Ini mudah untuk diuji, misalnya SELECT 'foo' AS bar FROM dual WHERE -7. Ekspresi -7 dievaluasi dalam konteks boolean, dan kueri mengembalikan baris. Kami dapat menguji dengan 0, atau ekspresi apa pun yang mengevaluasi nilai integer 0, dan tidak ada baris yang dikembalikan. Jika ekspresi dalam klausa WHERE mengevaluasi ke nilai integer bukan nol selain nol, ekspresi itu BENAR. (Saya percaya nilai desimal dan float dapat "dibulatkan" ke integer, misalnya WHERE 1/3dievaluasi WHERE 0. Kami mendapatkan hasil yang sama dengan WHERE 'foo', karena string 'foo'juga mengevaluasi nilai integer 0.
spencer7593
71

Ini adalah solusi elegan yang saya hargai karena menggunakan nol data byte:

some_flag CHAR(0) DEFAULT NULL

Untuk mengaturnya menjadi true, atur some_flag = ''dan atur ke false, atur some_flag = NULL.

Kemudian untuk menguji benar, periksa apakah some_flag IS NOT NULL, dan untuk menguji salah, periksa apakah some_flag IS NULL.

(Metode ini dijelaskan dalam "MySQL Kinerja Tinggi: Optimasi, Cadangan, Replikasi, dan Lainnya" oleh Jon Warren Lentz, Baron Schwartz, dan Arjen Lentz.)

RS
sumber
3
trik mewah! ini sangat membantu jika bekerja dengan MySQL <5 dan mungkin bahkan jejak yang lebih ringan dari BIT, namun dalam upaya untuk mematuhi konvensi dan overhead komputasi yang sedikit lebih sedikit (logika vs nilai tepat) Saya akan mengatakan BIT adalah cara yang lebih baik untuk dilakukan.
zamnuts
59
Mungkin 'cepat', tetapi mengaburkan data sedemikian rupa sehingga pengembang baru tidak akan tahu apa kepanjangan dari kolom tersebut.
Richthofen
5
Ini menggunakan jumlah byte yang sama dengan BIT (1)
ITS Alaska
25
Semoga berhasil mendapatkan ORM untuk memetakan ini dengan baik.
Craig Labenz
4
Saya setuju dengan @Richthofen, dan merasa sulit membayangkan situasi di mana saya akan menganjurkan menggunakan solusi ini. Namun, jika itu akan digunakan, maka menentukan sebagai COMMENTdalam definisi kolom yang NULLmenunjukkan salah dan ''menunjukkan benar mungkin pergi beberapa cara yang sangat kecil menuju membantu pemahaman masa depan.
eggyal
34

Jika Anda menggunakan tipe BOOLEAN, ini alias TINYINT (1). Ini yang terbaik jika Anda ingin menggunakan SQL standar dan tidak keberatan bahwa bidang tersebut dapat berisi nilai di luar rentang (pada dasarnya apa pun yang bukan 0 akan menjadi 'benar').

ENUM ('Salah', 'Benar') akan memungkinkan Anda menggunakan string dalam SQL Anda, dan MySQL akan menyimpan bidang secara internal sebagai bilangan bulat di mana 'Salah' = 0 dan 'Benar' = 1 berdasarkan urutan Enum ditentukan .

Di MySQL 5+ Anda bisa menggunakan bidang BIT (1) untuk menunjukkan tipe numerik 1-bit. Saya tidak percaya ini benar-benar menggunakan ruang kurang dalam penyimpanan tetapi sekali lagi memungkinkan Anda membatasi nilai yang mungkin ke 1 atau 0.

Semua hal di atas akan menggunakan kira-kira jumlah penyimpanan yang sama, jadi sebaiknya pilih yang menurut Anda paling mudah digunakan.

Ciaran McNulty
sumber
8
Komentar Anda tentang ENUM tidak benar: coba CAST (yourenumcol AS UNSIGNED) dan Anda akan melihat bahwa False akan menjadi 1, dan True akan menjadi 2. Masalah lain dengan ENUM adalah bahwa terlalu mudah untuk memasukkan '' (string kosong ). Saya akan merekomendasikan penggunaan ini.
Roland Bouman
4
Dalam pengalaman saya, menggunakan bidang BIT (1) dari kode PHP agak merepotkan. TINYINT (1) jauh lebih mudah dan menghasilkan kode yang lebih mudah dibaca.
M-Peror
1
@ M-Peror - "menggunakan bidang BIT (1) dari kode PHP agak merepotkan" ... tidak ada kata pun yang dimaksudkan. :) Tapi, ya, saya setuju. Saya ingat TINYINT (1) menjadi lebih mudah juga ... tidak bisa mengingat mengapa. Adakah yang memikirkan hal ini? BIT (1) tampaknya lebih bagus di permukaan karena Anda dapat membatasi ke 0 atau 1. Saya pikir BIT kadang-kadang diartikan sebagai data biner (tergantung pada bahasa pemrograman dan driver / perpustakaan); sedangkan, TINYINT diperlakukan lebih seperti angka.
BMiner
2
@BMiner - haha, itu benar-benar tidak disengaja, tidak menyadarinya :) Tapi memang, jika saya ingat dengan benar bidang bit ditafsirkan sebagai sesuatu yang biner, sedangkan tinyint lebih mudah diperlakukan sebagai angka dan karena itu, lebih mudah untuk gunakan dalam ekspresi (boolean).
M-Peror
34

Pertanyaan ini telah dijawab tetapi saya pikir saya akan memasukkan $ 0,02 saya. Saya sering menggunakan CHAR(0), dimana '' == true and NULL == false.

Dari mysql docs :

CHAR(0)juga cukup bagus ketika Anda membutuhkan kolom yang hanya dapat mengambil dua nilai: Kolom yang didefinisikan sebagai CHAR(0) NULLhanya menempati satu bit dan hanya dapat mengambil nilai NULLdan ''(string kosong).

Josh
sumber
16
mm, ini sepertinya meminta masalah jika Anda sebagai saya. Maksud saya, tergantung pada bahasanya mungkin terlalu mudah untuk tidak melihat perbedaan antara NULL dan '' (misalnya PHP).
Roland Bouman
3
Dalam hal menghemat ruang (jumlah byte yang digunakan untuk mewakili boolean), pendekatan ini adalah pemenang yang jelas. Ini menghemat satu byte lebih dari TINYINT. The downside (seperti beberapa komentar tunjukkan) adalah bahwa beberapa klien mungkin mengalami kesulitan membedakan antara NULL dan string kosong. Bahkan beberapa database relasional (misalnya Oracle) tidak membedakan antara string panjang-nol dan NULL.
spencer7593
3
Ini sangat pintar! Saya dulu menulis kode pintar, sekarang saya menghindarinya seperti wabah. Saya sekarang ingin kode saya memiliki maksud yang jelas, bukan hanya perilaku yang benar. Saranku? Hanya lakukan ini jika Anda ingin membingungkan siapa pun yang harus mendukung kode / basis data. Misalnya, dalam PHP keduanya ''dan nullmerupakan nilai-nilai palsu.
CJ Dennis
1
@ CJDennis Jika Anda mengabstraksi lapisan database Anda di belakang pola repositori, Anda tidak perlu khawatir tentang ketidakjelasan solusi ini.
Pemrogram
18

Saya menggunakan TINYINT (1) untuk menyimpan nilai boolean di Mysql.

Saya tidak tahu apakah ada keuntungan menggunakan ini ... Tetapi jika saya tidak salah, mysql dapat menyimpan boolean (BOOL) dan menyimpannya sebagai tinyint (1)

http://dev.mysql.com/doc/refman/5.0/id/other-vendor-data-types.html

Fred
sumber
17

Bit hanya menguntungkan daripada berbagai opsi byte (tinyint, enum, char (1)) jika Anda memiliki banyak bidang boolean. Satu bidang bit masih membutuhkan byte penuh. Dua bidang bit cocok dengan byte yang sama. Tiga, empat, lima, enam, tujuh, delapan. Setelah itu mereka mulai mengisi byte berikutnya. Pada akhirnya penghematannya sangat kecil, ada ribuan optimisasi lain yang harus Anda fokuskan. Kecuali jika Anda berurusan dengan sejumlah besar data, beberapa byte itu tidak akan bertambah banyak. Jika Anda menggunakan bit dengan PHP, Anda perlu mengetikkan nilai yang masuk dan keluar.

Thor
sumber
1
+1 untuk komentar typecasting. Untuk menambahkan ini ketika bekerja dengan bahasa pemrograman hindari menggunakan teknik pemrograman malas yang mendukung konsistensi. Gunakan operator identik bukan hanya sama. Dalam kasus PHP if ($ var == "") akan bernilai 0, false, null, undefined, dan "". untuk menguji semua nilai, seringkali yang terbaik adalah menggunakan if (true === empty ($ var)) karena akan menghindari kesalahan yang tidak terdefinisi juga. Anda juga harus memvalidasi tipe data yang bekerja dengan Anda jika (is_int ($ var) && $ var === 0) atau mengetikkannya untuk memaksanya menjadi tipe data spesifik (int) $ var untuk tugas tersebut.
fyrye
@Tor Apakah ini benar untuk MySQL pada tingkat yang sama juga berlaku untuk MSSQL? Saya memigrasikan aplikasi baru yang belum mulai diproduksi dari MSSQL ke MySQL. Saya tidak menggunakan PHP tetapi alih-alih mengkonversi C # ke Java 8. Mengingat bahwa Java adalah bahasa yang diketik dengan baik, saya tidak khawatir tentang penanganan tipe ... hanya semua flag bit yang akan berpindah dari satu byte hingga 8 flag ke 1 byte setiap bendera diberikan TINYINT (1). Apakah Anda tahu ada dokumentasi tentang topik ini untuk MySQL?
Zack Jannsen
1
@ Thor Melakukan riset lebih dalam, jelas apa jawabannya. Perubahan memang terjadi dan kami telah melihat peningkatan dalam penanganan ini. Ketahui bahasa Anda yang akan ada di Lapisan Aplikasi / Lapisan Akses Data dan ketahui dukungan perpustakaan Anda. Saya menggunakan Java saat ini dan BIT (1) adalah pilihan yang disarankan saat ini untuk perpustakaan seperti Hybernate dan penggunaan JDBC. Berikut adalah URL [Lihat tabel 5.2]: dev.mysql.com/doc/connector-j/en/…
Zack Jannsen
12

Sampai MySQL mengimplementasikan sedikit tipe data, jika pemrosesan Anda benar-benar ditekan untuk ruang dan / atau waktu, seperti dengan transaksi volume tinggi, buat bidang TINYINT yang dipanggil bit_flagsuntuk semua variabel boolean Anda, dan tutup dan geser bit boolean yang Anda inginkan dalam SQL Anda pertanyaan.

Misalnya, jika bit paling kiri Anda mewakili bidang bool Anda, dan 7 bit paling kanan tidak mewakili apa pun, maka bit_flagsbidang Anda akan sama dengan 128 (biner 10000000). Menutupi (menyembunyikan) tujuh bit paling kanan (menggunakan operator bitwise &), dan menggeser bit ke-8 tujuh spasi ke kanan, berakhir dengan 00000001. Sekarang seluruh angka (yang, dalam hal ini, adalah 1) adalah nilai Anda.

SELECT (t.bit_flags & 128) >> 7 AS myBool FROM myTable t;

if bit_flags = 128 ==> 1 (true)
if bit_flags = 0 ==> 0 (false)

Anda dapat menjalankan pernyataan seperti ini saat menguji

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

dll.

Karena Anda memiliki 8 bit, Anda berpotensi memiliki 8 variabel boolean dari satu byte. Beberapa programmer di masa depan akan selalu menggunakan tujuh bit berikutnya, jadi Anda harus menyembunyikannya. Jangan hanya bergeser, atau Anda akan menciptakan neraka untuk diri sendiri dan orang lain di masa depan. Pastikan Anda memiliki MySQL yang melakukan masking dan shifting Anda - ini akan jauh lebih cepat daripada menggunakan bahasa scripting web (PHP, ASP, dll.) Melakukannya. Juga, pastikan Anda menempatkan komentar di bidang komentar MySQL untuk bit_flagsbidang Anda .

Anda akan menemukan situs-situs ini berguna ketika menerapkan metode ini:

Jonathan
sumber
7
Ini sepertinya cara yang mengerikan untuk mengaburkan niat untuk programmer masa depan. Tentu tampak seperti banyak kesulitan untuk menyimpan 7 byte (dengan asumsi Anda menggunakan semua 8 bools dalam satu tabel!)
ya
@ya, tidak ada kebingungan sama sekali! Tulis dokumentasi dan komentar MySQL yang menjelaskan setiap bidang dalam tabel (sebagaimana jawabannya sebutkan)! Strategi membuka kedok MySQL yang disarankan terlihat solid dan menyimpan hingga 16 bidang boolean yang berbeda dengan hanya beberapa kolom lebih baik daripada memiliki 16 di antaranya. Jika terlalu membingungkan menggunakan manipulasi bit dan Anda lebih suka menggunakan bahasa scripting web Anda untuk mendapatkan setiap boolean, simpan saja sebagai VARCHARdan lakukan prosedur membuka kedok dalam kode (Anda juga tidak perlu membatasi ke 8 bidang) ...
CPHPython
The BITjenis ada. Lihat dev.mysql.com/doc/refman/8.0/id/bit-type.html
dolmen
10

Saya muak dengan mencoba untuk mendapatkan angka nol, NULLS, dan '' secara akurat memutari nilai PHP, MySql dan POST, jadi saya hanya menggunakan 'Ya' dan 'Tidak'.

Ini bekerja dengan sempurna dan tidak memerlukan perawatan khusus yang tidak jelas dan mudah dilakukan.

Geoff Kendall
sumber
17
Jika Anda benar-benar ingin menyia-nyiakan ruang sebanyak ini dan kompromi kinerja, Anda bisa setidaknya melakukan CHAR (1) dengan opsi Y dan N.
ILikeTacos
3
Dalam sebagian besar situasi dunia nyata ada perbedaan nyata antara 'tidak' dan tidak adanya informasi. Misalnya, Anda mungkin ingin mencentang kotak centang secara default jika pengguna belum benar-benar mengatakan 'tidak'. Tepatnya berapa banyak ruang yang Anda pikir Anda hemat, dan berapa banyak pemrosesan yang Anda lakukan setiap kali Anda perlu membedakan antara yang salah dan yang NULL - jika memang Anda bahkan BISA membedakan? Dalam dunia gambar dan video digital yang disimpan, sedikit atau dua penghematan ruang sama sekali tidak relevan tetapi kejelasan dan pemrosesan yang dikurangi adalah nyata.
Geoff Kendall
8
Jawaban ini tidak salah karena itu akan berhasil dan tidak seburuk orang-orang memberikannya penghargaan. Untuk sebagian besar proyek (yaitu: ukuran tabel <1mil baris) Perbedaan kinerja antara solusi yang disediakan akan diabaikan. Saya tidak akan mengeluh jika pertanyaan saya kembali dalam 7 vs 5 milidetik ... Agar adil jika meja Anda tumbuh ke baris 10mil atau lebih ini mungkin bukan solusi yang disukai.
Brad
1
+1 dari saya karena menggunakan tipe data ENUM. Saya pribadi lebih suka notasi ini: ENUM ('y', 'n'). Ini kompak (hanya satu byte panjang), intuitif dan tampan sebagai konvensi tingkat aplikasi untuk semua flag boolean. Anda dapat menggunakannya secara langsung dengan bidang formulir HTML. misalnya dengan PHP: <select name = "production"> <option value = "y" <? = $ production === 'y'? 'selected = "selected"': ''? >> Ya </option> <option value = "n" <? = $ production === 'n'? 'selected = "selected"': ''? >> Tidak </option> </select>
Vlado
2
Lol ini menarik mata saya, tetapi saya harus mengatakan @ GeoffKendall benar. Dalam banyak kasus tidak diperlukan kinerja optimal dan metode apa pun yang berfungsi untuk Anda adalah metode yang tepat.
Madmenyo
6

Mengacu pada tautan ini tipe data Boolean di Mysql , sesuai dengan penggunaan aplikasi, jika seseorang hanya ingin 0 atau 1 disimpan, bit (1) adalah pilihan yang lebih baik.

Vidz
sumber
6
Memang benar bahwa BIT(1)hanya akan memungkinkan b'0'atau b'1'nilai yang akan disimpan. Masalah terbesar dengan BITdatatype adalah bahwa berbagai pustaka klien memiliki beragam penanganan datatype. Lihat perilaku di berbagai alat SQL (SQLyog, TOAD untuk MySQL, SQL Developer), alat yang "membalikkan rekayasa" model database, dan berbagai klien, seperti JDBC, PHP, Perl DBI, dan untuk mengukur, coba beberapa kerangka kerja ORM ( Hibernate, Mybatis, JPA). Dalam hal kemudahan penggunaan, kompatibilitas alat / kerangka kerja / dukungan asli, TINYINT(1)adalah pemenang yang jelas.
spencer7593
Iya. Ini selesai tergantung pada kerangka kerja yang dipertimbangkan untuk aplikasi. Misalnya, kerangka kerja Phalcon PHP tidak menangani datatype Bit
Vidz
Sebagai catatan, MyBatis mendukung keduanya BITdan TINYINT. Lihat kelas JdbcType MyBatis, mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/type/…
Lucky
1
@Vidz Saya memberi Anda plus satu untuk menyebutkan BIT (1) tetapi juga akan menunjukkan kepada pengembang yang membaca ini - Ketahui bahasa Anda yang akan ada di Lapisan Aplikasi / Lapisan Akses Data dan tahu dukungan perpustakaan Anda. Saya menggunakan Java saat ini dan BIT (1) adalah pilihan yang disarankan saat ini untuk perpustakaan seperti Hybernate dan penggunaan JDBC. Berikut adalah URL [Lihat tabel 5.2]: dev.mysql.com/doc/connector-j/en/…
Zack Jannsen
6

Karena MySQL (8.0.16) dan MariaDB (10.2.1) keduanya mengimplementasikan batasan CHECK, sekarang saya akan menggunakan

bool_val TINYINT CHECK(bool_val IN(0,1))

Anda hanya akan dapat menyimpan 0, 1atau NULL, serta nilai-nilai yang dapat dikonversi ke 0atau 1tanpa kesalahan seperti '1', 0x00, b'1'atau TRUE/ FALSE.

Jika Anda tidak ingin mengizinkan NULLs, tambahkan NOT NULLopsi

bool_val TINYINT NOT NULL CHECK(bool_val IN(0,1))

Perhatikan bahwa hampir tidak ada perbedaan jika Anda menggunakan TINYINT, TINYINT(1)atau TINYINT(123).

Jika Anda ingin skema Anda kompatibel ke atas, Anda juga dapat menggunakan BOOLatauBOOLEAN

bool_val BOOL CHECK(bool_val IN(TRUE,FALSE))

db <> demo biola

Paul Spiegel
sumber
bagaimana dengan enum (0, 1)
santiago arizti
3
@santiagoarizti ENUM(harus enum('0', '1')- note: itu adalah string) bukan ide yang baik. Ada terlalu banyak masalah karena bagaimana hal itu disimpan secara internal, dan bagaimana nilai-nilai non-string diperlakukan. Misalnya. 0dan FALSE tidak bisa disimpan. 1dan TRUEmenjadi '0'. Dan 2menjadi '1'.
Paul Spiegel
Jawaban terbaik ... untuk mereka yang menggunakan MySQL 8+
dolmen
2

Setelah membaca jawaban di sini saya memutuskan untuk menggunakan bit(1)dan ya, entah bagaimana lebih baik dalam ruang / waktu, TAPI setelah beberapa saat saya berubah pikiran dan saya tidak akan pernah menggunakannya lagi. Ini rumit pengembangan saya, ketika menggunakan pernyataan yang sudah disiapkan, perpustakaan dll (php).

Sejak itu, saya selalu menggunakan tinyint(1), sepertinya cukup baik.

Lemur
sumber
3
Mau jelaskan dengan cara apa hal itu mempersulit perkembangan Anda?
Chazy Chaz
@ChazyChaz mengharapkan benar / salah, bukan 1/0, tidak seperti beberapa dbs lain seperti SQL Server. Ini kadang-kadang dapat menyebabkan situasi aneh di mana Anda pikir Anda menyetelnya menjadi kenyataan tetapi itu tidak benar-benar terjadi.
maembe
0

Anda dapat menggunakan tipe data BOOL, BOOLEAN untuk menyimpan nilai boolean.

Tipe-tipe ini adalah sinonim untuk TINYINT (1)

Namun, tipe data BIT (1) lebih masuk akal untuk menyimpan nilai boolean (baik benar [1] atau salah [0]) tetapi TINYINT (1) lebih mudah digunakan saat Anda mengeluarkan data, menanyakan, dan sebagainya dan untuk mencapai interoperabilitas antara MySQL dan database lain. Anda juga dapat memeriksa jawaban atau utas ini .

MySQL juga mengonversi BOOL, tipe data BOOLEAN ke TINYINT (1).

Selanjutnya, baca dokumentasi

Premkumar chalmeti
sumber