2011-08-02 25 views
8

私のinsert文は次のようになります。空の文字列は、NOT NULL

INSERT INTO foo (bar) VALUES (''); 

barフィールドがそうのように作成されました:

bar INT(11) 
    COLLATION: (NULL) 
    NULL: YES 
    DEFAULT: (NULL) 

MySQLバージョン:5.1。

NULLを挿入しないでください。なぜ私はテーブルにゼロ(0)が格納されているのか分かりません。

+0

mysqlの "strict mode" –

答えて

11

デフォルトでは、MySQLは、カラムの無効な値を正しいタイプに強制しようとします。ここで空文字列''はstring型で、整数でもNULLでもありません。

  1. 変更し、次への問合せ:INSERT INTO foo (bar) VALUES (NULL);
  2. MySQLでstrictモードを有効にします私は、次の手順を実行することをお勧めします。これにより、予期せぬタイプと値の変換が発生するのを防ぐことができます。 MySQLが期待していないことをしようとすると、より多くのエラーメッセージが表示されます。これは、問題をより迅速に発見するのに役立ちます。
+0

#2は多くを説明しています。ありがとうございました。 – gravyface

+0

厳密なモードは非常に重要です。 Mysqlのデフォルトは、データが荒れています。開発者として、実際にデータを切り捨てて、それを認識したくないのですか?ああ。 –

5

NULLをテーブルに挿入していません。空の文字列を挿入しています(これは明らかにゼロとしてintにマップされます)。 NULLはSQLの別の値であることに注意してください。 NULL != ''。任意の値(NULL以外)を指定すると、NULLは挿入されません。値を指定しないと、デフォルト値が使用されます。あなたの例では、整数列に文字列値を指定しました。

+0

も参照してください。明らかにゼロとしてマップされます。 "MySQLのマニュアルでは、数値型の場合、デフォルトは0ですが、デフォルトとしてNULLに明示的に設定されている場合列のために、なぜそれをゼロに設定していますか?私がどのように動作するかは、_anything_ですが、デフォルト値がNULLに設定されている場合、整数はNULLとして格納されます。 – gravyface

+3

列の既定値は、値を指定しない場合にのみ適切です。ここでは値を指定しましたが、無効なので、MySQLは整数を整数として解釈しようとします。それが到着する解釈は整数0です。 – Hammerite

2

これを行う方法は、フィールドをまったく埋めることではありません。実際に価値を持つ必要のあるものだけを埋めてください。

2

なぜNULLにする必要がありますか?整数表現の値を指定しています。空の文字列はINT0に変換されます。

を指定しなかった場合のみ、の値がデフォルト引き継ぎます。

関連する問題