MySQL строг режим и защо трябва да бъде активиран - Леонид Шевцов
MySQL има специален режим за въвеждане на некоректни данни в базата данни. Например, за да вмъкнете 2147483647 в полето INT вместо 20000000000. Или попълнете базата данни с несъществуващи дати. Или изрежете линии. Е, или никога не знаете за какво може да ви бъде полезен този режим.
Този режим се нарича "нормален режим". W.T.F?
Въпреки че на пръв поглед това изглежда лудост, има историческа причина за това поведение.
Механизмът MyISAM, който беше стандартният двигател MySQL доскоро, не поддържа транзакции. Ако една от „привидно атомарните“ групи заявки отпадне, базата данни (в общия случай) губи своята цялост. В сравнение с такава опасност записването на неправилни стойности в базата данни се оказа по-малкото зло.
Строг режим
От обширния списък с режими на MySQL, ние се интересуваме от режима STRICT_TRANS_TABLES. Той забранява това, за което говорих по-горе, и хвърля грешки при всякакви грешни данни.
На езика на заявките,
Разбира се, след такава промяна трябва да пуснете тестовете (ако има такива) или поне да следите за грешки (както ще се появят).
За да използвате винаги този режим в Ruby on Rails 3 (не разбирам защо не се включва автоматично), просто поставете следния код някъде в инициализаторите:
за какво говоря
Вчера дълго търсих защо плъгинът за обработка на отскоци не работи в тестовете. Това беше, защото Rails не поддържаше типа INT UNSIGNED, който беше използван от плъгина за съхраняване на CRC32. И те не просто не го поддържат, но вместо това записват знака INT във веригата. Тъй като rake db:test:prepare зарежда схемата, тогава в тестовата среда контролните суми не се вписват в рамката на полето за знаци и в базата даннисе оказа боклук.
Това беше последната капка.
Морал 1: Не използвайте INT UNSIGNED с Rails
Морал 2: Всички полета трябва да имат валидация
Най-малко всички полета, въведени от потребителя. Ако лицето въведе низ, проверете дали не е твърде дълъг. Ако е число, проверете дали е в допустимия диапазон. Грешка 500 никога няма да бъде адекватен отговор на лоши данни.