重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

ENUM列に列挙されていない値を挿入しようとしたときエラーにすることはできますか

例えば、
ENUM('-10', '-5', 'なし', '+5', '+10')
と定義した列に対して、'+2'を挿入しようとした場合はエラーにしたいです。
現状では、'+2'を挿入しようとすると、2番目の値と解釈され、'-5'が挿入されてしまうようです。

バッチ処理が、やっとこさ終わったと思いきや、データを確認してみてビックリですx_x

A 回答 (2件)

MySQLのバージョンを、少なくとも MySQL 4.0、4.1、5.0といったレベルまで書きましょう。



ENUMの仕様をマニュアルで確認しましたか?
値は文字とすべきで、数字や数字としてキャスト可能な値での仕様は、混乱の元なので使用すべきでないと、例まで記述されています。

http://dev.mysql.com/doc/refman/5.1/ja/enum.html

今回のケースでは、

(1)'+2'と一致する値は、ENUMで定義されていない
(2)(1)により、'+2'がインデックス値として使用可能と解釈された

ということです。

対策としては、ENUM値を数値と解釈されないように、英字や日本語などを使えば、別の値と解釈されることはなくなります。
また、ENUMで未定義であった場合に、無効な値として0を格納したり、エラーとしたり(SQLモードで指定)といったことも可能です。この辺は、MySQL 4.1か5.0くらいに標準設定に変更があったように記憶しています。

http://dev.mysql.com/doc/refman/5.1/ja/server-sq …
    • good
    • 0
この回答へのお礼

こんにちは
なんか、いきなり説教された感じですが・・・

要は無理ということですね・・・
さて、どうしよう・・・
インデックス値を使用禁止にするモードがあれば、いいのにな

お礼日時:2010/06/09 17:58

>さて、どうしよう・・・


>インデックス値を使用禁止にするモードがあれば、いいのにな

正規化して外部キー制約してみてはどうでしょう?
    • good
    • 0
この回答へのお礼

こんにちは、
外部キー制約とは、別のテーブルに列挙値を登録して参照するようなやり方でしょうか。
よく分からなかったので、不本意ですがVARCHAR型にすることにしました;;
これなら予期しない文字列が来た場合でも、そっくりそのまま登録されるので・・・

ENUM型は1バイトしか消費しないので魅力的だったのですが、まあ仕方ない

お礼日時:2010/06/11 08:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す