ENUM
ENUM (перечисление) - это столбец, который может принимать значение из списка допустимых значений, явно перечисленных в спецификации столбца в момент создания таблицы.
Этим значением также может быть пустая строка ("") или NULL при определенных условиях:
Каждая величина из допустимы имеет индекс:
mysql> SELECT * FROM tbl_name WHERE enum_col=0;
Например, столбец, определенный как 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
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.
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.
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!)
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
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};
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.