1318

MySQLには「ブール」データ型がないようですが、MySQLにtrue / false情報を格納するために「悪用」するデータ型はどれですか?

特に、PHPスクリプトとの間での書き込みおよび読み取りのコンテキストで。

時間をかけて、私はいくつかのアプローチを使用し、見てきました。

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

上記のどれも最適ではないようです。PHPでの自動型変換はブール値をかなり単純に与えるので、私はtinyint0/1バリアントを好む傾向があります。

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

4

13 に答える 13

1320

MySQL 5.0.3以降では、を使用できますBIT。マニュアルには次のように書かれています。

MySQL 5.0.3以降、ビットフィールド値を格納するためにBITデータ型が使用されます。BIT(M)のタイプは、Mビット値の格納を可能にします。Mの範囲は1〜64です。

それ以外の場合は、MySQLのマニュアルによると、BOOLまたはを使用できますBOOLEAN。これは、現時点ではtinyint(1)のエイリアスです。

ブール、ブール:これらのタイプはTINYINT(1)の同義語です。ゼロの値はfalseと見なされます。ゼロ以外の値は真と見なされます。

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

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

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

于 2008-11-14T10:50:51.943 に答える
273

BOOLBOOLEANは の同義語ですTINYINT(1)。ゼロはfalse、それ以外は ですtrue。詳細はこちら

于 2008-11-14T10:55:02.280 に答える
76

これは、ゼロ データ バイトを使用するため、私が高く評価するエレガントなソリューションです。

some_flag CHAR(0) DEFAULT NULL

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

次に、true をテストするには some_flagIS NOT NULLをチェックし、false をテストするには some_flag をチェックしますIS NULL

(この方法は、Jon Warren Lentz、Baron Schwartz、Arjen Lentz による「High Performance MySQL: Optimization, Backups, Replication, and More」で説明されています。)

于 2012-02-10T18:09:21.070 に答える
41

この質問には回答済みですが、0.02 ドルを投入することにしました。私はしばしば a を使用しCHAR(0)ます'' == true and NULL == false

MySQL ドキュメントから:

CHAR(0)2 つの値しかとれない列が必要な場合にも非常に便利です。 として定義されている列は、CHAR(0) NULL1 ビットのみを占有し、値NULL''(空の文字列) のみを受け取ることができます。

于 2009-04-30T17:39:49.200 に答える
33

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

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

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

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

于 2008-11-14T14:59:29.757 に答える
18

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

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

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

于 2008-11-14T10:42:51.210 に答える
18

Bit is only advantageous over the various byte options (tinyint, enum, char(1)) if you have a lot of boolean fields. One bit field still takes up a full byte. Two bit fields fit into that same byte. Three, four,five, six, seven, eight. After which they start filling up the next byte. Ultimately the savings are so small, there are thousands of other optimizations you should focus on. Unless you're dealing with an enormous amount of data, those few bytes aren't going to add up to much. If you're using bit with PHP you need to typecast the values going in and out.

于 2012-01-12T16:18:54.063 に答える
12

MySQL がビット データ型を実装するまでは、大量のトランザクションなど、処理が本当にスペースや時間に追われbit_flagsている場合は、すべてのブール変数に対して呼び出される TINYINT フィールドを作成し、SQL で必要なブール ビットをマスクしてシフトします。クエリ。

たとえば、左端のビットが bool フィールドを表し、右端の 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 ビットを使用するので、マスクする必要があります。そうしないと、将来、自分自身や他の人のために地獄を作ることになります。MySQL にマスキングとシフトを実行させてください。これは、Web スクリプト言語 (PHP、ASP など) に実行させるよりもはるかに高速です。また、フィールドの MySQL コメント フィールドにコメントを入力してくださいbit_flags

この方法を実装する際には、次のサイトが役立ちます。

于 2011-07-13T17:13:59.433 に答える
11

ゼロ、NULL、および''をPHP、MySql、およびPOST値のループを正確に丸めようとすることにうんざりしていたので、'Yes'と'No'を使用します。

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

于 2012-07-09T20:10:04.210 に答える
8

MySQL (8.0.16) と MariaDB (10.2.1) の両方が CHECK 制約を実装しているので、ここで使用します

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

01または、および、、または/のようなエラーなしNULLで変換できる値のみを格納できます。01'1'0x00b'1'TRUEFALSE

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))

デシベル<>フィドルのデモ

于 2019-05-26T17:53:19.503 に答える
4

ここで回答を読んだ後、私は使用することにしました。bit(1)はい、空間/時間の点で何とか優れていますがしばらくすると気が変わったので、二度と使用しません。準備されたステートメント、ライブラリなど(php)を使用すると、開発が非常に複雑になります。

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

于 2018-06-26T10:14:10.300 に答える