Search the MySQL manual:
Subscribe to the monthly
MySQL Newsletter!

6.2.3.3 Тип перечисления ENUM

ENUM (перечисление) - это столбец, который может принимать значение из списка допустимых значений, явно перечисленных в спецификации столбца в момент создания таблицы.

Этим значением также может быть пустая строка ("") или NULL при определенных условиях:

Каждая величина из допустимы имеет индекс:

Например, столбец, определенный как ENUM("один", "два", "три") может иметь любую из перечисленных величин. Индекс каждой величины также известен:

Величина Индекс
NULL NULL
"" 0
"один" 1
"два" 2
"три" 3

Перечисление может иметь максимум 65535 элементов.

Начиная с 3.23.51, оконечные пробелы автоматически удаляются из величин этого столбца в момент создания таблицы.

Регистр не играет роли, когда вы делаете вставку в столбец ENUM. Однако регистр значений, получаемых из этого столбца, совпадает с регистром в написании соответствующего значения, заданного во время создания таблицы.

Если вы делаете выборку столбца ENUM в числовом контексте, возвращается индекс значения. Например, вы можете получить численное значение ENUM таким образом:

mysql> SELECT enum_col+0 FROM tbl_name;

Если вы вставляете число в столбец ENUM, это число воспринимается как индекс, и в таблицу записывается соответствующее этому индексу значение перечисления. (Однако, это не будет работать с LOAD DATA, который воспринимает все входящие данные как строки.) Не рекомендуется сохранять числа в перечислении, т.к. это может привести к излишней путаннице.

Значения перечисления сортируются в соответствии с порядком, в котором допустимые значения были заданы при создании таблицы. (Другими словами, значения ENUM сортируются в соответствии с ихними индексами.) Например, "a" в отсортированном выводе будет присутствовать раньше чем "b" для ENUM("a", "b"), но "b" появится раньше "a" для ENUM("b","a"). Пустые строки возвращаются перед непустыми строками, и NULL-значения будут выведены в самую первую очередь.

Для предотвращения неожиданностей, указывайте список ENUM в алфавитном порядке. Вы также можете использовать GROUP BY CONCAT(col) чтобы удостовериться, что столбец отсортирован в алфавитном порядке, а не по индексу.

Если вам нужно получить список возможных значения для столбца ENUM, вы должны вызвать SHOW COLUMNS FROM имя_таблицы LIKE имя_столбца_enum и проанализировать определение ENUM во втором столбце.

User Comments

Posted by [name withheld] on May 17 2002 6:24am[Delete] [Edit]

It should be noted that although sort order works
on INDEX values rather instead of the ENUM value
(name), this is not true for comparison
operatators (<, <=, <, >= etc). These operators
appear to compare the string value of the name
instead of the index.
IE, for a table where column maxgrade is an enum
('PreK','K','1','2',3', ... '11','12','Adult'),
the expression:
SELECT * FROM classlist WHERE maxgrade <= 2
will return rows where the maxgrade is 12.
Greater-than comparisons will return true for the
non-numeric enum names, as well.

Posted by Willem-Jan van Dinter on May 24 2003 6:14pm[Delete] [Edit]

If you want to get an array in php with all possible values for an ENUM or SET column, you should use: SHOW COLUMNS FROM table_name LIKE 'enum_column_name' (with or without %-wildcards), and parse it with the following php script:

$result=mysql_query($query);
if(mysql_num_rows($result)>0){
$row=mysql_fetch_row($result);
$options=explode("','",preg_replace("/(enum|set)\('(.+?)'\)/","\\2",$row[1]));
}

Now $options is an array with all possible values

Hope it helps.

Posted by Ricky Chan on October 1 2003 4:33am[Delete] [Edit]

Be careful of expressions to match against the integer values,
Hudson's example:
SELECT * FROM classlist WHERE maxgrade <= 2
Could be redone as:
SELECT * FROM classlist WHERE maxgrade+0 <= 2
Which forces maxgrade to become a number first altough if you had maxgrade as index, it won't be used as it has to eval each maxgrade prior to test.

Similarly if you did .. where maxgrade in (1,3) this will do string comparison.. better to do either:

maxgrade = 1 or maxgrade = 3 (possibly using index)
maxgrade in ('value1','value3') (possibly using index)
maxgrade+0 in (1,3) (index.. no chance!)

Posted by syed aly on January 7 2004 2:39am[Delete] [Edit]

If you want to change the column type from enum to varchar then you can create a new table with the same structure and with the enum column redefined as varchar.
Then select * from first_table insert into second_table
will bring your data into the second table
Drop the first_table and
Rename the second_table to first_table

Posted by Sven Neuhaus on January 23 2004 8:54am[Delete] [Edit]

Thanks Willem-Jan.
Here's example code for perl to get possible values of an enum column:
$dbh->{FetchHashKeyName} = "NAME_lc";
$x = $dbh->selectrow_hashref("SHOW COLUMNS FROM tablename LIKE ?", undef, 'columnname');
$x->{type} =~ s/^enum\('//;
$x->{type} =~ s/'\)$//;
@fields = split /','/, $x->{type};

Posted by Jeroen Vercoulen on February 20 2004 3:56am[Delete] [Edit]

Please can anyone tell me how I can get a list of enum values in a simple table, but every value apart (example: in an apart column)

Greatingz...

I3udder

Add your own comment.