Spec-Zone.ru › MySQL 5.7

11.3.6 Тип SET

Объект типа SET — это строковый объект, который может иметь ноль или более значений, каждое из которых должно быть выбрано из списка разрешённых значений, указанных при создании таблицы. Значения столбцов типа SET, состоящие из нескольких элементов набора, задаются с элементами, разделёнными запятыми (,). Следствием этого является то, что SET значения элементов не должны содержать сами по себе запятые.

Например, столбец, заданный как SET('one', 'two') NOT NULL, может иметь любое из этих значений:

''
'one'
'two'
'one,two'

Столбец типа SET может иметь максимум 64 различных элемента. Таблица может содержать не более 255 уникальных определений списков элементов среди своих столбцов типов ENUM и SET в совокупности. Более подробную информацию об этом ограничении см. в разделе Ограничения, накладываемые структурой файла .frm.

Повторяющиеся значения в определении вызывают предупреждение или ошибку, если включён строгий режим SQL.

При создании таблицы из значений элементов SET в определении таблицы автоматически удаляются trailing spaces.

Требования к хранению для типа SET см. в разделе Требования к хранению для строкового типа.

Синтаксис и ограничения длины для типа SET см. в разделе Раздел 11.3.1, «Синтаксис данных строкового типа».

При получении значения, хранящиеся в столбце типа 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_col и проанализируйте определение SET в столбце Type вывода.

В API C значения SET возвращаются как строки. Информацию об использовании метаданных набора результатов для различения их от других строк см. .

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/set.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API