MySQLのBITとTINYINTの違いは何ですか?


106

どの場合にどれを使用しますか?違いはありますか?永続エンジンがブールを格納するために通常使用するものはどれですか?

回答:


122

TINYINTは8ビットの整数値で、BITフィールドは1ビットのBIT(1)と64ビットのBIT(64)の間で格納できます。ブール値の場合、BIT(1)はかなり一般的です。


10
TINYINTとBIT(8)の違いは何ですか?
Pacerier、2011年

16
TINYINTは符号付きまたは符号なしで、負の数に関連しています。ビットは、データに署名せずにビットを格納するだけで、MSBを自分で解釈する必要があります。
定義

4
混乱を避けるために、TINYINTとBIT(1)の格納要件に違いがないこと、およびBOOLとBOOLEANがTINYINT(1)数値型の概要の同義語であることを追加する必要があります。
Timo Strotmann、2018

59

数値型の概要から ;

ビット[(M)]

ビットフィールド型。Mは、1〜64の値あたりのビット数を示します。Mを省略した場合のデフォルトは1です。

このデータ型はMySQL 5.0.3でMyISAMに追加され、5.0.5でMEMORY、InnoDB、BDB、およびNDBCLUSTERに拡張されました。5.0.3より前は、BITはTINYINT(1)の同義語です。

TINYINT [(M)] [UNSIGNED] [ZEROFILL]

非常に小さな整数。符号付き範囲は-128〜127です。符号なし範囲は0〜255です。

さらにこれを考慮してください。

BOOL、BOOLEAN

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


12
あなたはそれbooleanが本当にほんの少しでもバイトを取るだろうと言っているので、BIT(1)はv5.0.3以降の方が良いですか?
パセリエ2012

3
はい、@ Pacerier。ブール値は、数値フィールドの醜いエイリアスです。
アクセル・コスタスペーニャ

7
実際のストレージに関しては、BIT(1)は依然として最小1バイトを占めます。BIT(M)=(M + 7)/ 8バイト。(1 + 7)/ 8 = 1バイト。数値型のストレージ要件を参照してください。
Drazen Bjelovuk 2017

1
悲しいことにBOOL/ BOOLEANの別名ですTINYINT(1)代わりにBIT。確かに、それらはすべて1バイト全体を占有することになりますが、意味的にBITははるかに適切です。
MestreLion

38

これらすべての理論的な議論は素晴らしいですが、実際には、少なくともMySQLを使用していて、実際にSQLServerも使用している場合は、ブール値には非バイナリデータを使用するのが最善です。 'データの出力、クエリなどを実行しています。MySQLとSQLServerの間で相互運用性を実現しようとしている場合(つまり、2つの間でデータを同期する場合)は、BITデータ型の処理が2つで異なるため、特に重要です。そのため、実際には、数値データ型を使用する場合、手間が大幅に軽減されます。MySQLがTINYINT(1)として格納されるBOOLまたはBOOLEANを使用することをお勧めします。MySQL WorkbenchとMySQL AdministratorがBITデータ型を表示する方法でさえ、良くありません(バイナリデータの小さな記号です)。


1
私の意見では、一部のインターフェイスなどが正しいバイナリデータを誤って解釈するのは私の責任ではありません。管理者(自分を含む)がいくつかの記号(MySQL Wrokbenchを参照)について不平を言った場合、これは私の正しい(バイナリ)データを、内容についての情報を提供しない記号として誤って解釈した人の責任です。MySQL / Oracleは間違いを犯しました。誰かが間違いを犯したからといって、プログラミングの概念を変えるつもりはありません。
Matmarbon 2015年

11

BITは0と1(およびフィールドがNOT NULLとして定義されていない場合はNULL)のみを許可する必要があります。TINYINT(1)は、符号なしであるかどうかに応じて、-128..127または0..255で1バイトに格納できる任意の値を許可します(1は、1桁のみを使用することを意図していますが、より大きな値を保存することを妨げないでください)。

5.0.3より古いバージョンの場合、BITはTINYINT(1)として解釈されるため違いはありません

BITには「これはブール値」のセマンティクスがあり、一部のアプリはTINYINT(1)を同じように見なすため(MySQLがそれを処理するために使用した方法により)、アプリはタイプをチェックする場合、列をチェックボックスとしてフォーマットできますそしてそれに基づいてフォーマットを決定します。


4

間違っているかもしれませんが:

Tinyintは0〜255の整数です

ビットは1または0です

したがって、私にとってはブール値の選択が少しです


申し訳ありませんが、ここではT_SQLを使用していると思ったのでわかりません
Allen Hardy

0

私の経験から、BITにはLinux OSタイプ(Ubuntu for ex)で問題があると言っています。私はdbをWindowsで開発し、すべてをLinuxに展開した後、BIT DATA TYPEを持つテーブルから挿入または選択したクエリで問題が発生しました。

今のところビットは安全ではありません。私はtinyint(1)に変更し、完全に動作しました。つまり、1または0であり、tinyint(1)であれば問題ない場合にのみ、区別するための値が必要です。

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