Загадочный тип данных Enum

Gigahard

Guest
Загадочный тип данных Enum

До сегоднешнего дня считал, что тип данных enum создан для хранения строго набора вариантов, определяемых при создании enum столбца.
Создавал я что то типа викторины, где таблица ответов содержала сами варианты ответов и столбец enum('Y','N') который определял бы правильность того или иного ответа.

Считал что при забивании вариантов ответов, будут проходить исключительно запросы содержащие корректные значения enum, т.е. или Y, или N. Ну или на худой конец какие либо сообщения от MySQL о несоответствии вводимого значения.

Однако при попытке ввода "левых" значений в поле enum, такой вариант тоже прокатывал и строка успешно записывалась.

В чем тогда смысл такого типа данных, который пропускает "левые" значения и не выдает даже никакого сообщения об ошибке!?
Конечно в поле enum записывается пустое значение (не null), но при этом ВСЯ вводимая строка записывается в таблицу, тем самым создавая мусор.

Можно конечно написать код проверки поля на допустимые значения, или процедуру очистки недопустимых строк, но какой тогда смысл в enum вообще? Ведь можно тогда и char и tinyint использовать!
 

Dor

Новичок
в поле enum записывается пустое значение (не null), но при этом ВСЯ вводимая строка записывается в таблицу
Индекс пустой ошибочной строки - 0. Это означает что можно использовать SELECT для того, чтобы найти записи, в которые были вставлены некорректные значения ENUM:

mysql> SELECT * FROM tbl_name WHERE enum_col=0;

http://dev.mysql.com/doc/mysql/en/enum.html
 

Gigahard

Guest
А смысл в enum если он позволяет вставлять эти самые некорректные значения? Смысл, что потом их можно обнаружить и потереть? Ну не бред ли?
Все равно если бы поле int допускало бы ввод значений типа text а потом нужно было бы запускать проверку на отлов "левых" строчек.

P.S. Заметил одну вещь. Если вводится корректное значение то в результате MySQL пишет 1 row affected. А если неправильное, то: 1 row affected, 1 warning.
Т.е предупреждение все же есть.
Вопрос как его перехватить и отменить ввод строки?
--------------------

Ради интереса протестил. Поле Int допускает ввод текстовых строк и создает строку с нулевым значением в поле int.:(
Похоже нужно перехватывать warning'и...
 

Romantik

TeaM PHPClub
tinyint(1) и intval при занесении ИМХО наилучший вариат, где 0 по умолчанию
 
Сверху