無料PHPプログラム

MySQL 5.1 リファレンスマニュアル :: 10 データタイプ :: 10.4 文字列タイプ :: 10.4.4 ENUM タイプ
« 10.4.3 BLOBとTEXT タイプ

10.4.5 SET タイプ »
Section Navigation      [Toggle]
  • 10.4 文字列タイプ
  • 10.4.1 CHAR と VARCHAR タイプ
  • 10.4.2 BINARY と VARBINARY タイプ
  • 10.4.3 BLOBとTEXT タイプ
  • 10.4.4 ENUM タイプ
  • 10.4.5 SET タイプ

10.4.4. ENUM タイプ

ENUM は、テーブルを作成する際カラム仕様の中で明確に列挙された許容値リストから選択された値を持つ文字列オブジェクトです。

列挙値は引用された文字列直定数である必要があります。これは、式でも、文字列値を評価するものでもありません。これは、ユーザ変数を列挙値として採用するべきではないという事も意味します。

その値は、特定の条件下では('')や NULL の空の文字列になる事もあります。

  • もし ENUM に無効な値(許容値リストに存在しない文字列)を挿入すると、特別エラー値として空の文字列が代わりに挿入されます。この文字列は、ゼロの数値を持つという点で、「通常の」 空の文字列とは区別することができます。 この後でもう少し詳しく説明します。

    もしストリクトSQLモードが有効なら、無効な ENUM 値を挿入しようとするとエラーが発生します。

  • もし ENUM カラムが NULL の許容を宣言すると、NULL 値はそのカラムにとって正当な値となり、デフォルト値は NULL になります。もし ENUM カラムが NOT NULL を宣言すると、許容値リストの最初の要素がそのデフォルト値となります。

それぞれの列挙値はインデックスを持ちます。

  • カラム仕様の中の許容可能エレメントリストからの値は1から始まる番号がつけられています。

  • 空の文字列エラーインデックス値は0です。これは、どの無効な ENUM 値に行が指定されたのかを見つける為に、次の SELECT ステートメントを利用する事ができるという事を意味します。

    mysql> SELECT * FROM tbl_name WHERE enum_col=0;
    
  • NULL 値のインデックスは NULL です。

  • 「インデックス」 という言葉は、列挙値リストの中の位置だけを表しています。これは、テーブルインデックスとは全く関係がありません。

例えば、ENUM('one', 'two', 'three') として指定されたカラムはここに表されている値のどれでも持つ事ができます。それぞれの値のインデックスも表示されています。

値 インデックス
NULL NULL
'' 0
'one' 1
'two' 2
'three' 3

1つの列挙は最大65,535エレメントを持つ事ができます。

テーブルが作成された時に、テーブル定義の中の ENUM メンバー値から後続スペースが自動的に削除されます。

検索された時は、ENUM カラムに格納された値はカラム定義で使用されたレターケースで表示されます。ENUM カラムは文字セットと照合に指定できる事を覚えて置いてください。バイナリ、またはケースに敏感な照合には、カラムに値を指定する時レターケースが考慮されます。

もし ENUM 値を数値コンテキストで検索するなら、カラム値のインデックスは返されます。例えば、このようにして ENUM カラムから数値を検索する事ができます。

mysql> SELECT enum_col+0 FROM tbl_name;

もし ENUM カラムに数字を格納すると、その数字は可能値のインデックスとして扱われ、格納された値はそのインデックスを持つ列挙番号となります。(しかしこれは全ての入力を文字列として扱う LOAD DATA とは機能 しません。)もし数値が引用されると、列挙値リストの中に適合する文字列がなければ、そのままインデックスとして解釈されます。これらの理由により、ENUM カラムを数字のように見える列挙値で定義する事は、複雑になり得るので お勧めできません。例えば、次のカラムは '0'、'1'、そして '2' の文字列値のある列挙番号を持ちますが、1、2、そして 3 の数値インデックス値は次のようになります。

numbers ENUM('0','1','2')

もし 2 を格納すると、それはインデックス値として解釈され、'1' となります。 (インデックス2の値)もし '2' を格納すると、それは列挙値と適合するので '2' として格納されます。もし '3' を格納すると、どの列挙値とも適合しないのでインデックスとして扱われ、'2' となります。 (インデックス3の値)

mysql> INSERT INTO t (numbers) VALUES(2),('2'),('3');
mysql> SELECT * FROM t;
+---------+
| numbers |
+---------+
| 1       | 
| 2       | 
| 2       | 
+---------+

ENUM 値は、カラム仕様にリストされた列挙番号の順番に従ってソートされます。(言い換えると、ENUM 値はそれらのインデックス番号によってソートされるという事になります。)例えば、'a' は ENUM('a', 'b') では 'b' の前にソートしますが、'b' は ENUM('b', 'a') では 'a' の前にソートします。空の文字列は、空ではない文字列の前にソートし、そして NULL 値はその他の全ての列挙値の前にソートします。予期しない結果を防ぐ為には、ENUM リストをアルファベット順に指定してください。カラムがインデックス番号ではなく、語彙的にソートされる為に、GROUP BY CAST(col AS CHAR) か GROUP BY CONCAT(col) を利用する事もできます。

ENUM カラムに有効な全ての値を究明したければ、SHOW COLUMNS FROM tbl_name LIKE enum_col を利用し、アウトプットの Type カラムの中の ENUM 定義を解析してください。

Copyright c 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates

無料CGI PHPスクリプト | 新着情報スクリプト | 営業日カレンダー | PHPマニュアル | MySQLマニュアル | PEARマニュアル

Copyright (c) 2010 jmcodex.com All rights reserved.