В MySQL есть такой специальный режим, предназначенный для введения в базу неправильных данных. Например, чтобы вместо
Режим этот называется «обычный режим».
Хоть с первого взгляда оно кажется безумным, у такого поведения есть историческая причина.
Движок MyISAM, бывший стандартным движком MySQL до совсем недавних пор, не поддерживает транзакции. Если отваливался один из «как бы атомарного» набора запросов, база (в общем случае) теряла целостность. По сравнению с такой опасностью запись в базу неверных значений оказалась наименьшим злом.
Но ведь все сколько-нибудь компетентные вебдевелоперы знают, что надо использовать движок InnoDB, который — в контексте хранилища для сайта — со всех сторон лучше MyISAMа. В частности, InnoDB поддерживает транзакции, и все сколько-нибудь адекватные ORM (или их живые заместители, кодирующие запросы к базе) используют эти транзакции для обеспечения атомарности изменений.
Вот и получается, если ты используешь InnoDB и транзакции, щадящее отношение MySQL тебе только вредит. Каждая пропущенная проверка грозит засорением базы данных. Вот наглядный пример — каким полем ты хранишь URL?
Из обширного списка режимов MySQL нас интересует режим
Говоря языком запросов,
Разумеется, после такого изменения нужно прогнать тесты (если они есть), или хотя бы следить за ошибками (поскольку они появятся).
Выводы, касающиеся
20000000000
вставлять в INT
-поле 2147483647
. Или наполнять базу несуществующими датами. Или обрезанными строками. Ну или мало ли для чего этот режим может тебе пригодится.Режим этот называется «обычный режим».
Хоть с первого взгляда оно кажется безумным, у такого поведения есть историческая причина.
Движок MyISAM, бывший стандартным движком MySQL до совсем недавних пор, не поддерживает транзакции. Если отваливался один из «как бы атомарного» набора запросов, база (в общем случае) теряла целостность. По сравнению с такой опасностью запись в базу неверных значений оказалась наименьшим злом.
Но ведь все сколько-нибудь компетентные вебдевелоперы знают, что надо использовать движок InnoDB, который — в контексте хранилища для сайта — со всех сторон лучше MyISAMа. В частности, InnoDB поддерживает транзакции, и все сколько-нибудь адекватные ORM (или их живые заместители, кодирующие запросы к базе) используют эти транзакции для обеспечения атомарности изменений.
Вот и получается, если ты используешь InnoDB и транзакции, щадящее отношение MySQL тебе только вредит. Каждая пропущенная проверка грозит засорением базы данных. Вот наглядный пример — каким полем ты хранишь URL?
VARCHAR(255)
? А адрес может быть и в 2 килобайта длиной. В «обычном режиме» при переполнении строки MySQL всего лишь запишет предупреждение в лог, который никто не читает.Строгий режим
Из обширного списка режимов MySQL нас интересует режим
STRICT_TRANS_TABLES
. Он запрещает то, о чем я рассказывал выше, и бросает ошибки на любые неправильные данные.Говоря языком запросов,
SET sql_mode='STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE';
Разумеется, после такого изменения нужно прогнать тесты (если они есть), или хотя бы следить за ошибками (поскольку они появятся).
Выводы, касающиеся
STRICT_TRANS_TABLES
применительно к Ruby on Rails, можно почитать у меня в блоге.