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?
mysql
boolean
sqldatatypes
Peter Mortensen
sumber
sumber
bit(1)
Agak ** untuk mengimpor dalam Excel. Beralih ketinyint(1)
pekerjaan.Jawaban:
Untuk MySQL 5.0.3 dan lebih tinggi, Anda bisa menggunakan
BIT
. Manual mengatakan:Jika tidak, menurut manual MySQL Anda dapat menggunakan bool dan boolean yang saat ini alias tinyint (1):
MySQL juga menyatakan bahwa:
Referensi: http://dev.mysql.com/doc/refman/5.5/id/numeric-type-overview.html
sumber
!$boolean
tidak akan pernah mengevaluasi dengan baik tanpa pemrosesan lebih lanjut.auto_increment
pada kolom yang mewakili nilai boolean?BOOL
danBOOLEAN
merupakan sinonim dariTINYINT(1)
. Nol adalahfalse
, yang lainnyatrue
. Informasi lebih lanjut di sini .sumber
(1)
lebih dari menentukan bagaimana nilai ditampilkan, jika Anda sadar tentang ukuran penyimpanan maka Anda ingin menggunakanBIT
sebagai gantinyaBIT(1)
danTINYINT(1)
keduanya akan menggunakan satu byte penyimpanan. Hingga MySQL 5.0.3,BIT
sebenarnya adalah sinonim untukTINYINT
. Kemudian versi MySQL mengubah implementasi BIT. Tetapi bahkan dengan perubahan implementasi, masih tidak ada "ukuran penyimpanan" manfaat untukBIT
tipe 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 menanganiBIT
kolom tipe data yang dikembalikan dengan tepat . ATINYINT
bekerja lebih baik.true
" tidak benar.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, misalnyaWHERE 1/3
dievaluasiWHERE 0
. Kami mendapatkan hasil yang sama denganWHERE 'foo'
, karena string'foo'
juga mengevaluasi nilai integer 0.Ini adalah solusi elegan yang saya hargai karena menggunakan nol data byte:
Untuk mengaturnya menjadi true, atur
some_flag = ''
dan atur ke false, atursome_flag = NULL
.Kemudian untuk menguji benar, periksa apakah some_flag
IS NOT NULL
, dan untuk menguji salah, periksa apakah some_flagIS NULL
.(Metode ini dijelaskan dalam "MySQL Kinerja Tinggi: Optimasi, Cadangan, Replikasi, dan Lainnya" oleh Jon Warren Lentz, Baron Schwartz, dan Arjen Lentz.)
sumber
COMMENT
dalam definisi kolom yangNULL
menunjukkan salah dan''
menunjukkan benar mungkin pergi beberapa cara yang sangat kecil menuju membantu pemahaman masa depan.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.
sumber
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 :
sumber
''
dannull
merupakan nilai-nilai palsu.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
sumber
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.
sumber
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_flags
untuk 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_flags
bidang 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.Anda dapat menjalankan pernyataan seperti ini saat menguji
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_flags
bidang Anda .Anda akan menemukan situs-situs ini berguna ketika menerapkan metode ini:
sumber
VARCHAR
dan lakukan prosedur membuka kedok dalam kode (Anda juga tidak perlu membatasi ke 8 bidang) ...BIT
jenis ada. Lihat dev.mysql.com/doc/refman/8.0/id/bit-type.htmlSaya 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.
sumber
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.
sumber
BIT(1)
hanya akan memungkinkanb'0'
ataub'1'
nilai yang akan disimpan. Masalah terbesar denganBIT
datatype 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.BIT
danTINYINT
. Lihat kelas JdbcType MyBatis, mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/type/…Karena MySQL (8.0.16) dan MariaDB (10.2.1) keduanya mengimplementasikan batasan CHECK, sekarang saya akan menggunakan
Anda hanya akan dapat menyimpan
0
,1
atauNULL
, serta nilai-nilai yang dapat dikonversi ke0
atau1
tanpa kesalahan seperti'1'
,0x00
,b'1'
atauTRUE
/FALSE
.Jika Anda tidak ingin mengizinkan NULLs, tambahkan
NOT NULL
opsiPerhatikan bahwa hampir tidak ada perbedaan jika Anda menggunakan
TINYINT
,TINYINT(1)
atauTINYINT(123)
.Jika Anda ingin skema Anda kompatibel ke atas, Anda juga dapat menggunakan
BOOL
atauBOOLEAN
db <> demo biola
sumber
ENUM
(harusenum('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.0
danFALSE
tidak bisa disimpan.1
danTRUE
menjadi'0'
. Dan2
menjadi'1'
.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.sumber
Anda dapat menggunakan tipe data BOOL, BOOLEAN untuk menyimpan nilai boolean.
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 .
Selanjutnya, baca dokumentasi
sumber