2011-11-17 8 views
8

私は、どのようにenumをmysqlで使用できるかを理解しようとしています。 enum型以外の列挙型フィールドに何かを挿入すると、mysqlは空の文字列(値0)を挿入します。MySQLの空の値enums

  • フルーツENUM( 'APPLE'、 'BANANA'、 'PEACH');
  • INSERT ...フルーツ= 'BANNANA'

シンプルなスペルミスとMySQLは、空の値を挿入し、データベースの整合性を破壊し、列挙型は非常に無駄になります。

CHECK制約は、ここに助けることができるが、MySQLは

私が見る唯一の方法は、空の文字列を防ぐためにトリガを書くことである(2011年「最も人気のある」データベースのかなり面白いし)、それらをサポートしていませんが、それは多すぎますそのような単純なケースのためにトリガを書く作業。

enumの「空文字列」MySQLの動作を無効にする方法はありますか?

おかげ

答えて

4

SQLモードを見てみましょうあなたは(つまり、ENUMにリスト内の文字列存在しない無効な値を挿入した場合documentation:

あたりとして

SET SQL_MODE='TRADITIONAL'; 
8

)、空の文字列が特別なエラー値として代わりに挿入されます。この文字列は、数値が0の文字列であるため、通常の空文字列と区別できます。

脇の下に、I(and others)は非常に効率的ではないため、列挙型を避けることをお勧めします。

実際にenumが必要な場合は、strictモードの使用を検討してください。厳密なモードは、ENUM列に無効な値を挿入しようとすると、少なくともエラーをスローします。それ以外の場合は、警告だけがスローされ、値は空の文字列 ''(内部的には0と参照されます)に設定されます。注:IGNOREを使用すると、strictモードでもエラーを抑制することができます。

ここにはdocumentation on setting your MySQL server modeへのリンクがあります。

ハッピーコーディング!

更新:ニックの答えは厳密なモードでサーバーを設定する方法の1つです。 TRADITIONALモードは、STRICT_TRANS_TABLES、STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USERと同等です。したがって、DATEなどの他のデータ型に対して追加のデータ検証が行われることに注意してください。