13.3.7 Тип 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 вывода.
В API C значения SET возвращаются как строки. Для получения информации об использовании метаданных набора результатов для различения их от других строк см. .
© 2025 Oracle
Licensed under the GPLv2 License.