MySQLのブール値のブールとtinyint(1)


124

ブール値のMySQLデータベースで使用するのに最適な列タイプはどれですか?私は使用してbooleanいますが、同僚が使用していtinyint(1)ます。


3
MySQLは透過的にとして処理するbooleanようtinyint(1)です。あなたが使用できるようにbooleantruefalseとMySQLはとして扱いtinyint(1)10
ADTC、2016年

もう1つのケースは、Y&Nのあるchar 1です。
Zon

回答:


153

これらのデータ型は同義語です。


6
データが同義語であるとは言えません-tinyint(1)はboolと同じですが、tinyintとboolは同じではありません。マイナーなポイントですが、私が初めて読んだとき、あなたの答えは私をつまずかせました
カイルチャダ

2
これは質問の答えにはなりません。tinyint(1)が機能的にboolと同じであることは事実ですが、OPは何を使用するのが最適かを尋ねました。@dj_segfaultによる回答は、ブール値を格納するときにtinyint(1)よりもboolを優先する必要がある理由を説明する適切な役割を果たします。
カイルモーガン

87

ここでは別のアプローチをとり、他の開発者がコンパイラ/データベースと同様にコードを理解することも同様に重要であることを提案します。ブール値を使用すると、tinyintを使用する場合と同じことを行うことができますが、意図が何であるかを意味的に伝えるという利点があり、それは何か価値があります。

tinyintを使用する場合、表示される値が0と1のみであることは明らかではありません。ブール値は常にtrueまたはfalseです。


35

booleanMySQLでは明確なデータ型ではありません。これはの同義語ですtinyintMySQLマニュアルのこのページを参照してください

個人的には、tinyintを設定として使用することをお勧めします。ブール値は、名前から行うとは思わないため、誤解を招く可能性のあるコードを作成するためです。しかし、実用的なレベルでは、それは本当に重要ではありません。どちらも同じことを行うので、どちらを使用しても何も得られたり、失ったりすることはありません。


8

enumを使用するのが最も簡単で最速

tinyint(1)が8ビットを必要とする一方で、bit(1)はブール値を格納するために1ビットしか必要としないため、enumまたはtinyint(1)はお勧めしません。

ref

MySQLのブール値のTINYINTとENUM(0、1)


データベースもsqliteをサポートする必要があるため、enumは使用できません
tom

11
InnoDBを使用している場合、ビットはtinyintと同じだけのスペースを使用することになります。高性能のMySQL(percona男)「のInnoDB店[s]はそれぞれ[ビット]列のビットを格納するための最小の整数型の十分な大きさとして、あなたは任意のストレージスペース保存しないようにします。」唯一の利点は、BIT(morethan1)列に複数のブール値を格納する場合です。したがって、ブール型フィールドが1つしかない場合、tinyintを使用することはInnoDBのビットと同じであり、tinyintの方が一般的に扱いやすいので、こちらをお勧めします。
billmalarky 2013

MySQLには当てはまりません:BIT(M) - approximately (M+7)/8 bytes参照:dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
Jens

6

それは本当だがbooltinyint(1)している機能的に同じで、boolそれはあなたが何をしようとしての意味論的な意味を運ぶために好ましい選択肢でなければなりません。また、多くのORMはbool、プログラミング言語のネイティブのブール型に変換されます。


0

Dapperを使用してMySQLに接続するときの私の経験は、それが重要であることです。次のスクリプトを使用して、nullを設定できないbit(1)をnullを設定できるtinyint(1)に変更しました。

ALTER TABLE TableName MODIFY Setting BOOLEAN null;

その後、Dapperは例外のスローを開始しました。台本の前後の違いを見てみました。そして、bit(1)がtinyint(1)に変更されたことに注意してください。

次に実行しました:

ALTER TABLE TableName CHANGE COLUMN Setting Setting BIT(1) NULL DEFAULT NULL;

これで問題は解決しました。

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