Вопрос № 131454: Здравствуйте!
Никак не могу понять типы данных "enum" и "set" в MySQL. Кто-то может объяснить своими словами?
(задал его здесь, потому как SQL от MySQL отличается - возможно, что и не имеет подобных конструкций)...
Вопрос № 131.454
Здравствуйте!
Никак не могу понять типы данных "enum" и "set" в MySQL. Кто-то может объяснить своими словами?
(задал его здесь, потому как SQL от MySQL отличается - возможно, что и не имеет подобных конструкций)
Отвечает: PVS@Lviv
Здравствуйте, Прим Палвер!
enum - тип который может принимать ТОЛЬКО заданые значения (например поле "пол" может принимать значения "не указан","мужской","женский")
set - принимает любые комбинации заданых значений, в том числе и пустую (например поле "интересы" может состоять из любой комбинации значений "спорт", "музыка", "кино" и т.д.)
подробнее читайте здесь и здесь
Ответ отправил: PVS@Lviv (статус: Специалист)
Ответ отправлен: 10.04.2008, 10:17 Оценка за ответ: 2 Комментарий оценки: Это же написано в учебниках
Это же мне и непонятно
Практически как можно применить?
Вот что собственно описано в мануале по мускулу.
-------------------------------------------------------------------
6.2.3.3. Тип перечисления ENUM
ENUM (перечисление) - это столбец, который может принимать значение из списка допустимых значений, явно перечисленных в спецификации столбца в момент создания таблицы.
Этим значением также может быть пустая строка ("") или NULL при определенных условиях:
*
Если делается всавка некорректного значения в столбец ENUM (т.е. вставка строки, не перечисленной в списке допустимых), то вставляется пустая строка, что является указанием на ошибочное значение. Эта строка отличается от "обычной" пустой строки по тому признаку, что она имеет цифровое значение, равное 0. Об этом чуть ниже.
*
Если ENUM определяется как NULL, то тогда NULL тоже является допустимым значением столбца и значение по умолчанию - NULL. Если ENUM определяется как NOT NULL, то значением по умолчанию является первый элемент из списка допустимых значений.
Каждая величина из допустимы имеет индекс:
*
Значение из списка допустимых величин, определенных при создании таблицы нумеруются, начиная с 1.
*
Индекс пустой ошибочной строки - 0. Это означает что вы можете использовать следующий SELECT для того, чтобы найти записи, в которые были вставлены некорректные значения ENUM:
mysql> SELECT * FROM tbl_name WHERE enum_col=0;
*
Индекс значения NULL - 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 во втором столбце.
6.2.3.4. Тип множества SET
SET - это строковый тип, который может принимать ноль или более значений, каждое из которых должно быть выбрано из списка допустимых значений, определенных при создании таблицы. Элементы множества SET разделяются запятыми. Как следствие, сами элементы множества не могут содержать запятых.
Например, столбец, определенный как SET("один", "два") NOT NULL может принимать такие значения:
""
"один"
"два"
"один,два"
Множество SET может иметь максимум 64 различных элемента.
Начиная с 3.23.51, оконечные пробелы удаляются из значений множества SET в момент создания таблицы.
MySQL сохраняет значения SET в численном виде, где младший бит сохраненной величины соответствует первому элементу множества. Если вы делаете выборку столбца SET в числовом контексте, полученное значение содержит соответствующим образом установленные биты, создающие значение столбца. Например, вы можете сделать выборку численного значения SET-столбца таким образом:
mysql> SELECT set_col+0 FROM tbl_name;
Если делается вставка в столбец SET, биты, установленные в двоичном представлении числа определяют элементы множества. Допустим, столбец определен как SET("a","b","c","d"). Тогда элементы имеют такие биты установленными:
SET элемент числовое значение двоичное значение
a 1 0001
b 2 0010
c 4 0100
d 8 1000
Если вы вставляет значение 9 в этот столбец, это соответствует 1001 в двоичном представлении, так что первый ("a") и четвертый ("d") элементы множества выбираются, что в результате дает "a,d".
Для значения, содержащего более чем один элемент множестве, не играет никакой роли, в каком порядке эти элементы перечисляются в момент вставки значения. Также не играет роли, как много раз то или иное значение перечислено. Когда позже это значение выбирается, каждый элемент будет присутствовать только единожды, и элементы будут перечислены в том порядке, в котором они перечисляются в определении таблицы. Например, если столбец определен как SET("a","b","c","d"), тогда
"a,d", "d,a", и "d,a,a,d,d" будут представлены как "a,d".
Если вы вставляете в столбец SET некорректую величины, это значение будет проигнорировано.
SET-значения сортируются в соответствии с числовым представлением. NULL-значения идут в первую очередь.
Обычно, следует выполнять SELECT для SET-столбца, используя оператор LIKE или функцию FIND_IN_SET():
mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;
Но и такая форма также работает:
mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';
mysql> SELECT * FROM tbl_name WHERE set_col & 1;
Первый оператор в каждом примере делает выборку точного значения. Второй оператор делает выборку значений, содержащих первого элемента множества.
Если вам нужно получить все возможные значения для столбца SET, вам следует вызвать SHOW COLUMNS FROM table_name LIKE set_column_name и проанализировать SET-определение во втором столбце.
Ответ отправил: Паутов Сегей Владимирович (статус: 1-ый класс)
Ответ отправлен: 10.04.2008, 18:02 Оценка за ответ: 4 Комментарий оценки: Спасибо хоть за русские мануалы. Несколько раз прочёл - немного яснее. Что-то эта тема трудно даётся.