2009-04-22 5 views
31

ブール値をビットデータ型としてSQLに格納しない理由はありますか?私はそれらをしばしば制約なしに0と1に制限するための整数として、T/F、True/False、Yes/Noなどのような文字列として保存しています。それをビットとして保存し、追加の制約について心配する必要はありませんか?私はここで何が欠けていますか?ブール値をビットデータ型としてSQLに格納しない理由はありますか?

答えて

43

私はいつもこれを保存するために私ができる最小のデータ型にこだわると思います。

  • のSQLServer:BIT
  • オラクル:NUMBER(1)(またはPL/SQLでBOOLEAN)
  • のMySQL:OracleのBOOLEAN:TINYINT

編集(IIRC BOOLEANマップこの自動的に) PL/SQLのみであり、表定義ではありません。これを反映するように更新されました。一般的に道を何が起こるか

+1

Re。 「最小データ型」:SQL ServerのBIT値は実際には1ビット幅ではなく、1バイト幅の倍数です。ただし、同じテーブル内の複数のBITが同じストレージに格納されます。 – Tomalak

+0

MySQLはBITタイプもサポートしており、そのストレージ要件はTomalak氏の説明とまったく同じです。 –

+0

@Chad:MySQL BITカラムは、SQLServer BITカラムとはまったく異なります。 SQLServerのBITフィールドには1つの値が格納され、複数のBITフィールドが格納されている場合にはBITフィールドが結合されます。 MySQL BITフィールドは、(宣言に基づいて)1〜64ビットのビットマスクです。 – Powerlord

0

1つの理由は、人がビットについて知らないことや、y/nが書式設定の方が簡単だと考えていることです。 他の理由は時々あなたは考える:おそらく多分これはブールフィールド以上のものになるだろう。あなたはそれをちょうどintにします。

あなたは何が不足していない:)

11

は、誰かがあなたが今、ビットを持っている場合、あなたが開始するtinyint型を持っていた場合

をTINYINTするすべてのコードを変更する必要があり、ないと多分yesにも追加したいということです私はあなたが思っている以上にこのことが起こると信じています。

+0

+1私は前にこのような状況に遭遇しました...それほど頻繁ではありませんが、それは醜い頭を育てました。 – mattruma

+1

考えてみると、しばしばリファクタリングが難しくありません。 – mattruma

+0

+1私はそれがその生涯のある時点でブールから州またはステータスの列に変わることがわかります。 – cgreeno

4

私はいつもビットデータ型を使用しています。 SQLではNULLにすることができます。しかし、あなたのプログラムを実行するときは、bool(例えばC#で)が値型であることを考慮する必要があります。この型はNULLにすることはできません。 System.DBNull値と比較する必要があります。

+1

Nullable として変数を指定するだけでは、NULL値を処理できませんでしたか? – mattruma

+1

SQLでNOT NULLにする.........テーブルblaを作成する(回答ビットがNULLでない) – SQLMenace

+0

問題はADO.NETがサポートしているものか、その他のデータアクセスフレームワークです。 Nullableが許可されている場合私達は大丈夫です! – rguerreiro

4

私たちは常にデータをビットとして保存しますが、それは小さく、さらに重要なことに、これはそのために設計されています。

エンドユーザーがデータを直接操作する時間があり、Yes/NoまたはY/Nの方が読みやすくなりました。この場合、わかりやすいデータ表示を反映したビューを作成しました。私は彼らがしばしば 0と1に値を制限するために、制約なし整数 として保存、およびT/Fのようなもの 、真/偽、はい/いいえ、などと文字列として、 再びなしで見

+5

私の最初のプロジェクトを入れ直した後の私の最後の2つの仕事は、彼らは私を元に戻し、「0」を「N」に、1を「T」に変更しました。 「私は決して覚えがたい」「私は0 =偽はコンピューティング101だと思ったが、わからないのはかなり一般的だ。それとも、それは私が働く良い場所を選んでいないサインだ。 – dwidel

7

制約。 ビットとして保存するのではなく、 を追加してください。 という制約がありますか?

はい!

私はここで何が欠けていますか?

実際には、「私はここで何が欠けていないのですか?答えはコモンセンスです。

3

BITは、BOOLEAN値を格納するために通常使用されるデータ型です。 BITが1の場合はtrue、0の場合はfalseです。それは簡単です。

0

私は3番目の正規化フォームは、TrueとFalseの値を格納しているテーブルを持っていて、それを参照する必要があると述べています。あなたもあなたの日付でそれを行うことを確認してください!

しかし3NFには完全に従っていますか? ;)

+1

Third Normal Formの定義に別のソースを見つけることができます。すべての列のすべての値もテーブルのどこかに格納しなければならないということは何もありません。 –

-1

私はビットをたくさん使います。しかし、時には私はfalseを返す能力を持つことができる、あるいは真の(エラーメッセージのような)多くの価値を持ちたいと思っています。したがって、ブール値の代わりにintを使用すると、次のようなことができます。

0 =偽 1 =パスワードが間違っています 2 =ユーザー名が存在しません。 3 =アカウントがロックアウトされました。 4 =アカウントが無効です。

など。そうしない

+2

それはブール値ではありません。それはコード値です。定義によるブール値は真または偽であり、真の複数の定義はありません。 –

+0

私が言ったように、私はビットをたくさん使います。私は代わりの解決策を提示しました。私の投稿を読むと、私は時にはブール値の代わりにintを使うと言っていました。 –

3

いくつかの理由は、次のとおりです。

わけではありませんすべてのデータベースは、ビットデータ型を持っているあなたは、あなたがすることはできませんインデックスビットフィールド一部のデータベースではdifferntバックエンド

を使用できるようにint型の代わりに使用しますので。

あなたの持っているものは本当に真偽ではありません。他の可能性はありません。例えば、あなたは開いた状態や閉じた状態などの状態を表すビットフィールドを持っているかもしれません。しかし、後で、あなたはステータスとしてキャンセルする必要があることもわかります。

1

ステータスが3つ以上ある場合は、列挙型を使用します。

関連する問題