Должен ли я отключить строгий режим MySQL?

Я работаю над сайтом, на котором включен строгий режим MySQL. У одного человека была длинная строка пользовательского агента, которая была зарегистрирована в нашей таблице журнала, и, к сожалению, строка пользовательского агента превысила ограничение для столбца и, таким образом, вызвала предупреждение. Данные вообще не вставлялись.

Чтобы избежать подобных неприятностей, стоит ли отключать строгий режим MySQL или придумать что-то самому (у меня PHP)?


person Tower    schedule 03.04.2011    source источник
comment
Вы можете проверить длину строки на уровне приложения перед ее вставкой.   -  person Pekka    schedule 03.04.2011
comment
@Pekka: Как бы вы поступили разумно? Я не хочу вызывать методы повсюду в программном обеспечении.   -  person Tower    schedule 03.04.2011
comment
ну, вы, по-видимому, все равно должны где-то избегать входящих данных. substr() там будет работать и не будет слишком много беспорядка. Если ваше приложение работает со строгим режимом, в противном случае (и это здорово), я бы пошел по этому пути и оставил режим как есть.   -  person Pekka    schedule 03.04.2011


Ответы (4)


Проверьте данные, прежде чем вставлять их в базу данных. Если строка слишком велика для вашей таблицы, либо ваш столбец слишком узок, либо данные недействительны. Вам нужно решить, будете ли вы усекать его перед сохранением, создавать отчеты об ошибках или и то, и другое.

Не не отключайте функции безопасности вашей СУБД, это совершенно неправильно.

person Mat    schedule 03.04.2011
comment
Я хотел бы, чтобы вы могли выразить это более жирным шрифтом. И было бы неплохо, если бы вы могли увеличить строгость MySQL до 11. - person mu is too short; 03.04.2011
comment
У меня не сложилось впечатление, что режим сервера — это функция безопасности. Хотя я думаю, это зависит от вашего определения функции безопасности - person ChrisWue; 03.04.2011
comment
@ChrisWue: я бы не назвал безмолвное искажение ваших данных функцией безопасности. - person mu is too short; 03.04.2011

Вы бы предпочли, чтобы ваши данные были скрыто усечены (что может привести к повреждению данных) или вы, по крайней мере, хотели бы знать, что у вас есть проблема?

Я бы порекомендовал оставить строгий режим включенным и проверить границы ваших данных в вашем PHP. Ваше PHP-приложение знает или, по крайней мере, должно знать, что делать со слишком длинной строкой. Если вы отключите строгий режим и предоставите это решение MySQL, то MySQL будет молча обрезать ваши строки, и вы получите базу данных, полную мусора.

Изменить и исправить код легко, исправить поврежденные данные часто невозможно.

Если вы отключите строгий режим, вы столкнетесь с такими странными проблемами:

VARCHAR(4), хранящий больше четырех символов

person mu is too short    schedule 03.04.2011

Ну, вы можете попробовать его с отключенным строгим режимом и посмотреть, как все работает, у меня никогда не было проблем с его отключением, но будьте осторожны.

Однако, если длинные пользовательские агенты являются единственной проблемой в строгом режиме, и вы не читаете их визуально, я рекомендую просто хешировать ваши UA или увеличить длину поля.

person acadler    schedule 03.04.2011

Если у вас есть необходимость сделать так, сбойные запросы, и у вас нет знаний или бюджета, чтобы это исправить - тогда да.

Если кто-то спрашивает, как правильно отключить строгий режим, просто добавив это в конфигурацию MySQL:

sql_mode=NO_ENGINE_SUBSTITUTION
innodb_strict_mode=0
person Luka    schedule 15.03.2019