13.3.6 Тип SET
Объект типа SET — это строковый объект, который может иметь ноль или более значений, каждое из которых должно быть выбрано из списка разрешённых значений, указанного при создании таблицы. Значения столбцов SET, состоящие из нескольких элементов множества, указываются с элементами, разделёнными запятыми (,). Следствием этого является то, что SET значения элементов сами по себе не должны содержать запятые.
Например, столбец, заданный как SET('one', 'two')
NOT NULL, может иметь любое из этих значений:
''
'one'
'two'
'one,two'
Столбец типа SET может иметь максимум 64 различных элемента.
Повторяющиеся значения в определении вызывают предупреждение или ошибку, если включён строгий режим SQL.
Пробелы в конце SET значений элементов в определении таблицы автоматически удаляются при создании таблицы.
См. Требования к хранению для строкового типа для требований к хранению для типа SET.
См. Раздел 13.3.1, «Синтаксис типа данных строки» для синтаксиса типа SET и ограничений по длине.
При получении значения, хранящиеся в столбце типа SET, отображаются с использованием регистра, который использовался в определении столбца. Обратите внимание, что столбцам типа 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 в двоичном представлении, то выбираются первый и четвёртый SET элементы множества 'a' и 'd', а результатом является значение 'a,d'.
Для значения, содержащего более одного элемента SET, порядок перечисления элементов при вставке значения не имеет значения. Также не имеет значения, сколько раз один и тот же элемент указан в значении. При последующем извлечении каждого элемента значения появляется один раз, причём элементы перечисляются в порядке, указанном при создании таблицы. Предположим, что столбец задан как SET('a','b','c','d'):
mysql> CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
Если вы вставляете значения 'a,d', 'd,a', 'a,d,d', 'a,d,a' и 'd,a,d':
mysql> INSERT INTO myset (col) VALUES
-> ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
Тогда при получении все эти значения появляются как 'a,d':
mysql> SELECT col FROM myset;
+------+
| col |
+------+
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
+------+
5 rows in set (0.04 sec)
Если вы задаёте столбец типа SET недопустимое значение, это значение игнорируется, и выдаётся предупреждение:
mysql> INSERT INTO myset (col) VALUES ('a,d,d,s');
Query OK, 1 row affected, 1 warning (0.03 sec)
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column 'col' at row 1 |
+---------+------+------------------------------------------+
1 row in set (0.04 sec)
mysql> SELECT col FROM myset;
+------+
| col |
+------+
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
+------+
6 rows in set (0.01 sec)
Если строгий режим SQL включён, попытки вставить недействительные значения SET приводят к ошибке.
Значения SET сортируются по порядку возрастания.
Значения NULL сортируются раньше нечисловых NULL SET значений.
Функции, такие как SUM() или AVG(), которые ожидают числовой аргумент, преобразуют аргумент в число, если необходимо. Для значений SET операция преобразования вызывает использование числового значения.
Обычно вы ищете значения SET, используя функцию FIND_IN_SET() или оператор LIKE:
mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;
mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
Первое утверждение находит строки, где set_col содержит value элемент множества. Второе аналогично, но не то же самое: оно находит строки, где set_col содержит value в любом месте, даже как подстроку другого элемента множества.
Также разрешены следующие утверждения:
mysql> SELECT * FROM tbl_name WHERE set_col & 1;
mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';
Первое из этих утверждений ищет значения, содержащие первый элемент множества. Второе ищет точное совпадение. Будьте осторожны при сравнении второго типа. Сравнение значений множеств с ' даёт другие результаты, чем сравнение значений с val1,val2''. Вы должны указать значения в том же порядке, в котором они перечислены в определении столбца.val2,val1'
Чтобы определить все возможные значения для столбца типа SET, используйте SHOW COLUMNS FROM
и проанализируйте определение tbl_name LIKE
set_colSET в столбце Type вывода.
В C API значения SET возвращаются как строки. Для получения информации об использовании метаданных набора результатов для различения их от других строк см. .
© 2025 Oracle
Licensed under the GPLv2 License.