BOOLEANまたはTINYINTの混乱


92

ブール日付型を使用してtrueまたはfalseの2つの状態のみを格納する必要があるサイトのデータベースを設計していました。MySQLを使用しています。
phpMyAdminを使用してデータベースを設計しているときに、BOOLEANデータ型とTINYINTデータ型の両方があることがわかりました。
別の記事を読みましたが、TINYINTはBOOLEANと同じで、違いはないという人もいました。BOOLEANがMySQLでTINYINTに変換されると言う人もいます。

私の質問は、両方が同じである場合、なぜ2つ存在するのですか?それらの1つだけがあります。

ここに私が読んだ記事への参照があります:
http : //www.careerride.com/MySQL-BOOL-TINYINT-BIT.aspx
http://dev.mysql.com/doc/refman/5.5/en/numeric-type -overview.html

回答:


137

MySQLには内部ブールデータタイプはありません。最小の整数データ型-TINYINTを使用します。

BOOLEANとBOOLは同義語であるため、TINYINT(1)と同等です。

このテーブルを作成してみてください-

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

次にSHOW CREATE TABLEを実行すると、この出力が表示されます-

CREATE TABLE `table1` (
  `column1` tinyint(1) DEFAULT NULL
)

1
しかし、あなたの答えは他のすべての面で正しいです。OPを混乱させているように見えるのは、同義語の存在です。
ypercubeᵀᴹ

2
下位互換性のために行われているようです。BOOLEANデータ型はMySQL 5より前のものであり、最適化されたBIT型ではなく、TINYINTでもありました。ドキュメントから-5.1で計画されている新機能:BITタイプを最適化して1ビットを取得します。(BITは1バイトを使用します。TINYINTの同義語として扱われます。)
Devart

5
はい、あなたが知ることができる持っているBIT(1)BIT(17)、あるいはBIT(64)
ypercubeᵀᴹ

3
@Devart-あなたの回答が最も投票数が多く、最初に(とにかく私のリストで)表示され、時間が経過した場合、MySQL 5.1のBITタイプの説明を含めるために回答に追加する可能性がありますか?後で?
ジョナサン

3
@Jonathanおそらくそれは価値があると言及するかもしれませんが、BIT(1)は実際にはTINYINT(1)よりも少ないスペースを使用せず、ほとんどの人が標準のmysqlコンソールを使用するときに期待するように表示されません。その欠点とストレージの利点がないため、TINYINT(1)またはBOOLEANを使用するだけが私の経験では最も一般的なようです。
タイラースミス

31

php開発者へのメモ(これをコメントとして投稿するのに必要なスタックオーバーフローポイントがない)... TINYINTへの自動マジック(およびサイレント)変換は、phpが「BOOLEAN」列から値を「0」または「1」、予想される(私による)true / falseではありません。

テーブルの作成に使用されたSQLを見ていて、「some_boolean BOOLEAN NOT NULL DEFAULT FALSE」のようなものを見ている開発者は、その列を含む行が取得されると、true / falseの結果を期待するのが妥当です。代わりに(少なくとも私のバージョンのPHPでは)、結果は「0」または「1」になります(はい、文字列「0」または文字列「1」、int 0/1ではありません。phpに感謝します)。

これは重要ではありませんが、単体テストが失敗するのに十分です。


2
追加の注記として、PHPのmysqlドライバーはすべての整数型を文字列として取り込みます。
kojow7 2017

24

最新のMySQLバージョンは新しい持っているBITあなたは、たとえば、フィールド内のビット数を指定できるデータ型BIT(1)として使用するBooleanことが唯一できるため、種類0またはを1


7

MySql 5.1バージョンのリファレンス現在

BIT(M) =  approximately (M+7)/8 bytes, 
BIT(1) =  (1+7)/8 = 1 bytes (8 bits)

================================================== =======================

TINYINT(1) take 8 bits.

https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html#data-types-storage-reqs-numeric


1
ご参考に必要なストレージは実際には「約(M + 7)/ 8バイト」です。つまり、次の完全なバイトに切り上げられます。したがって、1ビットかかりませ
mpen 2017年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.