Если вы помните мой пост Как отключить строгий режим MySQL на Laravel Forge (Ubuntu), вы уже знаете, что MySQL 5.7 представил то, что-то обычно называется «строгий режим», который на самом деле является сочетанием новых режимов. В сумме они заставляют MySQL обрабатывать ваши запросы немного более строго, чем раньше.

В той статье я показал, как отключить его на Ubuntu. Но с тех пор, Adam Wathan добавил функционал к Laravel, который позволяет определить, используете ли вы «строгий режим». А также позволяет настроить, какие точно режимы вы хотите использовать — и все это через код.

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


Стоит отметить, что вы можете использовать эту функцию не только, чтобы отключить строгий режим в 5.7. Можете включить его в 5.6 и это весьма дальновидно. Включить строгий режим на любом приложение, которое работает с 5.6, чтобы впоследствии безболезненно перейти на 5.7. Так вы заранее поймате, все что может упасть.


MySQL 5.7 и «строгий» режим.


Прежде чем говорить о самой фиче, давайте быстро освежим в памяти что означает «строгий режим».

MySQL имеет «режимы», каждый из которых включает или отключает определенное поведение. Например, ERROR_FOR_DIVISION_BY_ZERO это режим, который, как вы уже догадались, выдает ошибку, когда вы делите на ноль в SQL. Если этот режим отключен, вы просто молча получите результат NULL.

«Строгий режим», на самом деле является списком следующих настроек включенных в 5.7 по умолчанию:

ONLY_FULL_GROUP_BY
STRICT_TRANS_TABLES
NO_ZERO_IN_DATE
NO_ZERO_DATE
ERROR_FOR_DIVISION_BY_ZERO
NO_AUTO_CREATE_USER
NO_ENGINE_SUBSTITUTION

Вы можете узнать больше об этих режимах в документации MySQL.

До версии 5.7 единственный режим, который был включен по умолчанию — NO_ENGINE_SUBSTITUTION.

Включение/выключение “строгого” режима в Laravel 5.2


Благодаря этой новой фиче в Laravel теперь можно сделать три вещи: Отключить «строгий режим», возвращаясь к поведению <= 5.6; включить «строгий режим», установив его на поведение 5.7; или настроить точно какие именно режимы включены.

Эти параметры живут в конфигурационном / database.php в connections.mysql разделе. Для начала, давайте посмотрим на включение/выключение «строгого» режима.

'connections' => [
        'mysql' => [
           // Поведение MySQL 5.6
            'strict' => false,

           // Поведение  MySQL 5.7
            'strict' => true,
        ]
    ]

Точная настройка режимов


Но что, если вас не устраивают режимы 5.6 и 5.7 по умолчанию? Просто настройте их самостоятельно.

'connections' => [
        'mysql' => [
           // Игнорировать этот ключ, полагаться  на ключ strict
            'modes' => null,

           // Отключить принудительно все режимы, переопределяя  настройку strict
            'modes' => [],

           // Принудительно включить только указанные  режимы, переопределяя  настройку strict
            'modes' => [
                'STRICT_TRANS_TABLES',
                'ONLY_FULL_GROUP_BY',
            ],
        ]
    ]

На этом все


Теперь у вас есть возможность взять полный контроль над тем какие режимы MySQL включены в коде, не касаясь конфигурации сервера.

По умолчанию, я рекомендовал бы включать “строгий” режим полностью. Но, могут быть какие-то конкретные случаи или старые проекты, когда может потребоваться осуществить тонкую настройку режимов и теперь это не просто возможно а очень просто!

Комментарии (0)