Статьи

Используйте строгий режим MySQL на всех новых проектах!

MySQL — это база данных, которая изгибает стандарт SQL таким образом, что затрудняет переход с MySQL. То, что может показаться умной техникой для блокировки вендора (или просто надзора за стандартом), может быть довольно раздражающим в понимании реального значения языка SQL.

Одним из таких примеров является интерпретация MySQL того, как GROUP BYработает . В MySQL, в отличие от любой другой базы данных, вы можете помещать произвольные выражения в ваше SELECTпредложение, даже если они не имеют формальной зависимости от GROUP BYвыражения. Например:

SELECT employer, first_name, last_name
FROM employees
GROUP BY employer

Это будет работать в MySQL, но что это значит? Если у нас будет только одна результирующая запись на каждого employer, кто из сотрудников будет возвращен? Семантика вышеприведенного запроса действительно такая:

SELECT employer, ARBITRARY(first_name), ARBITRARY(last_name)
FROM employees
GROUP BY employer

Если предположить, что существует такая функция агрегирования, как ARBITRARY(). Некоторые могут утверждать, что это может быть использовано для некоторой умной «оптимизации» производительности. Я говорю: не надо. Это так слабо указано, что даже не ясно, будут ли две ссылки этой псевдоагрегированной ARBITRARY()функции генерировать значения из одной и той же записи.

Достаточно взглянуть на количество вопросов о переполнении стека, возникающих вокруг ошибки «не выражение GROUP BY» :

Я уверен, что часть этого ущерба, который был причинен поколению разработчиков SQL, связана с тем, что это работает в некоторых базах данных.

ONLY_FULL_GROUP_BY

Но в MySQL есть флаг, который называется ONLY_FULL_GROUP_BY, и Morgan Tocker, менеджер сообщества MySQL, предлагает включить его по умолчанию .

Члены сообщества MySQL склонны соглашаться с тем, что это хорошее решение в долгосрочной перспективе .

Хотя, конечно, очень трудно включить этот флаг для унаследованного приложения, все новые приложения, созданные поверх MySQL, должны обязательно включить этот флаг. Фактически, новые приложения должны даже рассмотреть возможность полного включения «режима строгого SQL» , чтобы убедиться, что они получают более качественный и современный интерфейс SQL.

Для получения дополнительной информации о режимах сервера MySQL, пожалуйста, обратитесь к руководству:

http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html