Pull to refresh

Строгий режим MySQL и почему он должен быть включен

Reading time2 min
Views40K
В 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, можно почитать у меня в блоге.
Tags:
Hubs:
Total votes 98: ↑83 and ↓15+68
Comments42

Articles