web-dev-qa-db-ja.com

ブール値を格納するために使用するMySQLデータ型

MySQLには「ブール値」のデータ型がないように思われるので、どのデータ型をMySQLに真偽の情報を格納するために「悪用」しますか?

特にPHPスクリプトとの間の読み書きのコンテキストで。

時が経つにつれて私はいくつかのアプローチを使い、見てきました。

  • tinyint、値0/1を含むvarcharフィールド
  • 文字列 '0'/'1'または 'true'/'false'を含むvarcharフィールド
  • そして最後に2つのオプション 'true'/'false'を含むFieldsを列挙します。

上記のどれも最適とは思えません。 PHPの自動型変換ではなく単純にブール値が得られるので、tinyint 0/1の変種を好む傾向があります。

それで、あなたはどのデータ型を使いますか?見落としていたブール値用に設計された型はありますか?どちらかのタイプを使用することによって長所/短所がありますか。

1109
Beat

MySQL 5.0.3以降ではBITを使用できます。マニュアルは言う:

MySQL 5.0.3以降では、ビットフィールド値を格納するためにBITデータ型が使用されています。一種のBIT(M)は、Mビット値の記憶を可能にする。 Mは1から64の範囲です。

そうでなければ、MySQLのマニュアルによると、現時点では tinyint (1)のエイリアスであるboolとbooleanを使用できます。

Bool、ブール値:これらの型は _ tinyint _ (1)の同義語です。ゼロの値は偽と見なされます。ゼロ以外の値はtrueと見なされます。

MySQLはまた次のように述べています。

将来のMySQLリリースでは、標準SQLに従って、完全なブール型処理を実装する予定です。

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

1157
markus

BOOLBOOLEANTINYINT(1)の同義語です。ゼロはfalse、それ以外はtrueです。より多くの情報 ここ

224
Philip Morton

これはゼロデータバイトを使用しているので、私は非常に高く評価しています。

some_flag CHAR(0) DEFAULT NULL

これをtrueに設定するにはsome_flag = ''を設定し、falseに設定するにはsome_flag = NULLを設定します。

次に、trueをテストするにはsome_flag IS NOT NULLを確認し、falseをテストするにはsome_flag IS NULLを確認します。

(この方法は、Jon Warren Lentz、Baron Schwartz、およびArjen Lentzによる「高性能MySQL:最適化、バックアップ、複製など」で説明されています。)

68
R. S.

この質問は回答されていますが、私は0.02ドルを投じたいと思いました。私はよくCHAR(0)を使います。ここで '' == trueとNULL == falseです。

からmysql docs

CHAR(0)NULLとして定義されている列は1ビットのみを占有し、NULLおよび ''(空の文字列)の値のみを取ることができる。

34
Josh

BOOLEAN型を使用すると、これはTINYINT(1)にエイリアスされます。これは、標準化されたSQLを使用し、フィールドに範囲外の値が含まれる可能性があることを気にしない場合に最適です(基本的に0以外のものはすべて「真」になります)。

ENUM( 'False'、 'True')を使用するとSQLで文字列を使用でき、MySQLはEnumが指定された順序に基づいて 'False' = 0および 'True' = 1の整数としてフィールドを内部的に格納します。 。

MySQL 5以降では、BIT(1)フィールドを使用して1ビットの数値型を示すことができます。これは実際にはストレージ内の使用スペースが少ないとは思わないが、ここでも可能な値を1または0に制限することができます。

上記のすべてでほぼ同じ量のストレージが使用されるため、最も使いやすいものを選択することをお勧めします。

31
Ciaran McNulty

Mysqlにブール値を格納するためにTINYINT(1)を使用します。

私はこれを使用する利点があるかどうかわからない...しかし私が間違っていないなら、mysqlはブール値(BOOL)を格納することができ、それはtinyint(1)としてそれを格納する

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

18
Fred

あなたがたくさんのブールフィールドを持っているならば、Bitは様々なバイトオプション(tinyint、enum、char(1))よりも有利です。 1ビットフィールドはまだ全バイトを占有します。 2つのビットフィールドが同じバイトに収まります。 3、4、5、6、7、8。その後、彼らは次のバイトを埋め始めます。結局のところ節約は非常に小さいです、あなたが集中するべきである他の何千もの他の最適化があります。膨大な量のデータを扱っているのでなければ、それらの数バイトが足りなくなることはありません。 PHPとbitを使っているのなら、出入りする値を型キャストする必要があります。

16
Thor

大量のトランザクションの場合のように、処理がスペースや時間に対して真に押されている場合、MySQLがbitデータ型を実装するまで、すべてのブール変数に対してbit_flagsというTINYINTフィールドを作成し、あなたが望むブールビットをマスクしてシフトします。 SQLクエリ.

たとえば、左端のビットがブールフィールドを表し、右端の7ビットが何も表していない場合、bit_flagsフィールドは128(バイナリ10000000)になります。右端の7ビットを(ビット演算子&を使用して)マスクし(隠し)、8番目のビットを7スペース右にシフトして00000001にします。これで整数(この場合は1)になります。

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

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

テストするときには、次のような文を実行できます。

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

等.

あなたは8ビットを持っているので、あなたは1バイトから潜在的に8つのブール変数を持っています。将来の一部のプログラマは常に次の7ビットを使用するので、 must maskとしてください。ただシフトしないでください、さもなければあなたは将来あなた自身と他の人のために地獄を作成するでしょう。あなたのMySQLがあなたのマスキングとシフトをするようにしてください - これはウェブスクリプト言語(PHP、ASPなど)がそれをするよりはるかに速いでしょう。また、bit_flagsフィールドのMySQLコメントフィールドに必ずコメントを入れてください。

この方法を実装する際には、次のサイトが便利です。

13
Jonathan

私は、ゼロ、NULLS、そしてPHP、MySql、POSTの値のループを正確に一周することにうんざりしていたので、 'Yes'と 'No'を使います。

これは完璧に機能し、明白で簡単なことではない特別な処理は必要ありません。

10
Geoff Kendall

Mysqlでこのリンクを参照する ブールデータ型 、アプリケーションの使用法によると、0または1だけを格納したい場合は、bit(1)がより良い選択です。

6
Vidz

ここで答えを読んだ後、私はbit(1)を使うことに決めました、そして、はい、それはどういうわけか空間/時間においてより良いです、BUT私は気が変わったので私は二度とそれを使いません。プリペアドステートメント、ライブラリなどを使うとき(php)、それは私の開発を非常に複雑にしました。

それ以来、私はいつもtinyint(1)を使っています。

1
Lemures

MySQL(8.0.16)とMariaDB(10.2.1)の両方がCHECK制約を実装していたので、私は今使用するでしょう

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

010NULL/TRUEなどのエラーなしで1または'1'に変換できる値だけでなく、0x00b'1'またはFALSEのみを格納できます。

NULLを許可したくない場合は、NOT NULLオプションを追加してください。

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

TINYINTTINYINT(1)、またはTINYINT(123)を使用しても実質的に違いはないことに注意してください。

スキーマに上位互換性を持たせたい場合は、BOOLまたはBOOLEANも使用できます。

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

db <>フィドルデモ

0
Paul Spiegel