Pertanyaan Tipe data MySQL mana yang digunakan untuk menyimpan nilai boolean


Karena MySQL tampaknya tidak memiliki tipe data 'boolean', tipe data mana yang Anda 'siksa' untuk menyimpan informasi yang 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 'true' / 'false'
  • dan akhirnya enum Fields berisi dua opsi 'true' / 'false'.

Tidak ada yang di atas tampaknya optimal. Saya cenderung memilih varian 0/1 yang kecil, karena konversi jenis otomatis dalam PHP memberi saya nilai boolean yang lebih sederhana.

Jadi jenis data apa yang Anda gunakan? Apakah ada tipe yang dirancang untuk nilai-nilai boolean yang telah saya abaikan? Apakah Anda melihat ada keuntungan / kerugian dengan menggunakan satu jenis atau yang lain?


990
2017-11-14 10:36


asal


Jawaban:


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

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

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

Bool, Boolean: Jenis ini sinonim untuk TINYINT(1). Nilai dari   nol dianggap salah. Bukan nol   nilai dianggap benar.

MySQL juga menyatakan bahwa:

Kami bermaksud menerapkan boolean penuh   penanganan jenis, sesuai dengan   standar SQL, di masa depan MySQL   melepaskan.

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

BTW: ini hanya masalah https://google.com/search?q=mysql+boolean+datatype.

Lucu bukan, tautan ini, diposting beberapa tahun yang lalu, telah menjadi rekursif.


1064
2017-11-14 10:50



BOOL dan BOOLEAN adalah sinonim dari TINYINT(1). Zero adalah false, yang lainnya true. Informasi lebih lanjut sini.


200
2017-11-14 10:55



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

some_flag CHAR(0) DEFAULT NULL

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

Kemudian untuk menguji kebenaran, periksa apakah some_flag IS NOT NULL, dan untuk menguji false, periksa apakah some_flag IS NULL.

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


64
2018-02-10 18:09



Pertanyaan ini telah dijawab tapi saya pikir saya akan melempar $ 0,02 saya. Saya sering menggunakan CHAR (0), di mana '' == true dan NULL == false.

Dari dokumen mysql

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


32
2018-04-30 17:39



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

ENUM ('False', 'True') akan membiarkan Anda menggunakan string dalam SQL Anda, dan MySQL akan menyimpan bidang secara internal sebagai integer di mana 'False' = 0 dan 'True' = 1 berdasarkan pesanan Enum ditentukan .

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

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


28
2017-11-14 14:59



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

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

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


16
2017-11-14 10:42



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


14
2018-01-12 16:18



Sampai MySQL menerapkan sedikit datatype, jika proses Anda benar-benar ditekan untuk ruang dan / atau waktu, seperti dengan transaksi volume tinggi, buat bidang TINYINT yang disebut bit_flags untuk semua variabel boolean Anda, dan mask dan geser bit boolean yang Anda inginkan dalam kueri SQL Anda.

Misalnya, jika paling kiri Anda mewakili bidang bool Anda, dan 7 bit paling kanan mewakili apa pun, maka Anda bit_flags field akan sama dengan 128 (binary 10000000). Mask (sembunyikan) tujuh bit paling kanan (menggunakan operator bitwise &), dan menggeser 8 bit tujuh spasi ke kanan, berakhir dengan 00000001. Sekarang seluruh nomor (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 Anda menguji

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

dll.

Karena Anda memiliki 8 bit, Anda memiliki 8 variabel boolean potensial dari satu byte. Beberapa programmer masa depan akan selalu menggunakan tujuh bit berikutnya, jadi Anda harus topeng. Jangan hanya bergeser, atau Anda akan menciptakan neraka untuk diri sendiri dan orang lain di masa depan. Pastikan Anda memiliki MySQL masking dan pergeseran Anda - ini akan secara signifikan lebih cepat daripada memiliki bahasa web-scripting (PHP, ASP, dll) melakukannya. Juga, pastikan bahwa Anda menempatkan komentar di bidang komentar MySQL untuk Anda bit_flags bidang.

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


12
2017-07-13 17:13