Spec-Zone .ru
спецификации, руководства, описания, API
|
ENUM
строковый объект со значением, выбранным из списка разрешенных значений,
которые перечисляются явно в спецификации столбца в табличное время создания. У этого есть эти преимущества:
Компактное хранение данных в ситуациях, где у столбца есть ограниченный набор
возможных значений. Строки, которые Вы определяете как входные значения, автоматически кодируются как
числа. См. Раздел 11.6, "Требования Хранения Типа
данных" для требований хранения для ENUM
типы.
Читаемые запросы и вывод. Числа преобразовываются назад в соответствующие строки в результатах запроса.
и эти потенциал выходит, чтобы рассмотреть:
Если Вы делаете перечислимые величины, которые похожи на числа, легко перепутать литеральные значения с их внутренними индексами, как объяснено в Разделе 11.4.4, "Ограничениях".
Используя ENUM
столбцы в ORDER
BY
пункты требуют дополнительной заботы, как объяснено в Разделе
11.4.4, "Сортируя".
ENUM
Столбцы Перечислимая величина должна быть заключенным в кавычки строковым литералом. Например, можно составить таблицу с
ENUM
столбец как это:
CREATE TABLE shirts ( name VARCHAR(40), size ENUM('x-small', 'small', 'medium', 'large', 'x-large'));INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'), ('polo shirt','small');SELECT name, size FROM shirts WHERE size = 'medium';+---------+--------+| name | size |+---------+--------+| t-shirt | medium |+---------+--------+UPDATE shirts SET size = 'small' WHERE size = 'large';COMMIT;
Вставка 1 миллиона строк в эту таблицу со значением 'medium'
потребовал бы 1
миллиона байтов хранения, в противоположность 6 миллионам байтов, если бы Вы сохранили фактическую строку 'medium'
в a VARCHAR
столбец.
У каждой перечислимой величины есть индексирование:
Элементы, перечисленные в спецификации столбца, являются присвоенными индексами, начинаясь 1.
Индексировать значение пустого строкового ошибочного значения 0. Это означает, что
можно использовать следующий SELECT
оператор тот, чтобы найти строки, в который недопустимый ENUM
значения были
присвоены:
mysql> SELECT * FROM tbl_name
WHERE enum_col
=0;
Индексирование NULL
значение NULL
.
Термин "индексир" здесь относится к позиции в пределах списка перечислимых величин. Это не имеет никакого отношения к таблице, индексирует.
Например, столбец, определенный как ENUM('Mercury', 'Venus', 'Earth')
может иметь
любое из значений, показанных здесь. Индексирование каждого значения также показывают.
Значение | Индексировать |
---|---|
NULL |
NULL |
'' |
0 |
'Mercury' |
1 |
'Venus' |
2 |
'Earth' |
3 |
ENUM
у
столбца может быть максимум 65 535 отличных элементов. (Практический предел - меньше чем 3000.) У таблицы может
быть не больше, чем 255 уникальных определений списка элемента среди ENUM
и SET
столбцы, которые рассматривают как группу. Для получения дополнительной информации по этим пределам см. Раздел E.10.5, "Пределы, Наложенные .frm
Файловая структура".
Если Вы получаете ENUM
значение в числовом контексте, значение столбца индексирует,
возвращается. Например, можно получить числовые значения от ENUM
столбец как это:
mysql> SELECT enum_col
+0 FROM tbl_name
;
Функции такой как SUM()
или
AVG()
это ожидает числовой
бросок параметра параметр числу в случае необходимости. Для ENUM
значения, индекс
используется в вычислении.
Конечные пробелы автоматически удаляются из ENUM
элемент оценивает в табличном
определении, когда таблица составляется.
Когда получено, значения, сохраненные в ENUM
столбец выводится на экран, используя
lettercase, который использовался в определении столбца. Отметьте это ENUM
столбцы
могут быть присвоены набор символов и сопоставление. Для двоичных или чувствительных к регистру сопоставлений
lettercase принимается во внимание, присваивая значения столбцу.
Если Вы храните число в ENUM
столбец, число обрабатывается как индексирование в
возможные значения, и сохраненное значение является элементом перечисления с этим, индексируют. (Однако, это
не работает с LOAD DATA
, который обрабатывает весь ввод как строки.), Если числовое
значение заключается в кавычки, оно все еще интерпретируется как индексирование, если нет никакой строки
соответствия в списке перечислимых величин. По этим причинам не желательно определить ENUM
столбец с перечислимыми величинами, которые похожи на числа, потому что это
может легко стать запутывающим. Например, у следующего столбца есть элементы перечисления со строковыми
значениями '0'
, '1'
, и '2'
, но числовой индексируют значения 1
, 2
, и 3
:
numbers ENUM('0','1','2')
Если Вы храните 2
, это интерпретируется как индексировать значение, и становится
'1'
(значение с индексирует 2). Если Вы храните '2'
,
это соответствует перечислимую величину, таким образом, это сохранено как '2'
. Если
Вы храните '3'
, это не соответствует перечислимой величины, таким образом, это
обрабатывается как индексирование и становится '2'
(значение с индексирует 3).
mysql>INSERT INTO t (numbers) VALUES(2),('2'),('3');
mysql>SELECT * FROM t;
+---------+| numbers |+---------+| 1 || 2 || 2 |+---------+
Определить все возможные значения для ENUM
столбец, использовать SHOW COLUMNS FROM
и синтаксический анализ tbl_name
LIKE 'enum_col
'ENUM
определение в Type
столбец вывода.
В API C, ENUM
значения возвращаются как строки. Для получения информации об
использовании метаданных набора результатов, чтобы отличить их от других строк, см. Раздел
22.8.5, "Структуры данных API C".
NULL
Перечислимые величины Перечислимая величина может также быть пустой строкой (''
) или NULL
при определенных обстоятельствах:
Если Вы вставляете недопустимое значение в ENUM
(то
есть, строка, не существующая в списке разрешенных значений), пустая строка вставляется вместо этого как
специальное ошибочное значение. Эту строку может отличить от "нормальной"
пустой строки факт, что у этой строки есть числовое значение 0. См. Раздел
11.4.4, "Индексируйте Значения для Литералов Перечисления" для деталей о числовом,
индексирует для перечислимых величин.
Если строгий режим SQL включается, попытки вставить недопустимый ENUM
значения приводят к ошибке.
Если ENUM
столбец, как объявляют, разрешает NULL
, NULL
значение является допустимым
значением для столбца, и значение по умолчанию NULL
. Если ENUM
столбец объявляется NOT NULL
, его
значение по умолчанию является первым элементом списка разрешенных значений.
ENUM
значения сортируются основанные на их индексах, которые зависят от порядка, в
котором элементы перечисления были перечислены в спецификации столбца. Например, 'b'
виды прежде 'a'
для ENUM('b',
'a')
. Пустые строковые виды перед непустыми строками, и NULL
вид
значений перед всеми другими перечислимыми величинами.
Предотвратить неожиданные результаты при использовании ORDER BY
пункт на ENUM
столбец, используйте один из этих методов:
Определите ENUM
список в алфавитном порядке.
Удостоверьтесь, что столбец сортируется лексически, а не индексом, кодируя ORDER BY CAST(
или
col
AS CHAR)ORDER BY CONCAT(
.col
)
Перечислимая величина не может быть выражением, даже та, которая оценивает к строковому значению.
Например, это CREATE TABLE
оператор не работает потому
что CONCAT
функция не может использоваться, чтобы создать перечислимую величину:
CREATE TABLE sizes ( size ENUM('small', CONCAT('med','ium'), 'large'));
Также невозможно использовать пользовательскую переменную как перечислимую величину. Эта пара операторов не работает:
SET @mysize = 'medium';CREATE TABLE sizes ( size ENUM('small', @mysize, 'large'));
Мы строго рекомендуем, чтобы Вы не использовали числа в качестве
перечислимых величин, потому что это не экономит на хранении по соответствующему TINYINT
или SMALLINT
введите, и легко перепутать строки и базовые значения числа (который
не мог бы быть тем же самым), если Вы заключаете в кавычки ENUM
значения
неправильно. Если Вы действительно используете число в качестве перечислимой величины, всегда включайте это в
кавычки. Если кавычки опускаются, число расценивается как индексирование. См. Раздел
11.4.4, "Обработка Литералов Перечисления", чтобы видеть, как даже заключенное в кавычки число
могло по ошибке использоваться, поскольку числовое индексирует значение.
Двойные значения в определении вызывают предупреждение, или ошибку, если строгий режим SQL включается.