web-dev-qa-db-ja.com

ブールまたはタイニントの混乱

ブール型の日付型を使用して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

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

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

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

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

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

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

PHP開発者への注意(これをコメントとして投稿するために必要なstackoverflowポイントがない)... TINYINTへの自動(およびサイレント)変換は、phpが "BOOLEAN"列から値を "0"または「私」が期待する真/偽ではなく、「1」。

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

ちょっとしたことですが、単体テストが失敗するのに十分です。

29
Tom Stambaugh

最新のMySQLバージョンには、フィールドのビット数を指定できる新しいBITデータ型があります。たとえば、0または1のみであるため、Boolean型として使用するBIT(1)です。

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

7
fortune

MySQLの数値型の概要:BOOL、BOOLEAN:これらの型はTINYINT(1)の同義語です。値ゼロは偽と見なされます。ゼロ以外の値は真と見なされます。

こちらをご覧ください: https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html