Перенёc PHP проект в DOCKER из бэкапов (NGINX+PHP+MySQL). Конфиги так же скопировал, пакеты такие же. Поведение при вставке записей изменилось. WHY?
PHP 7.1, Yii1.1 MariaDB 10
В целевой таблице есть ограничения not null для некоторых полей.
На исходном сервере операция добавления записи из web-формы работает.
На созданной копии сваливается:
CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[HY000]: General error: 1364 Field 'data_field' doesn't have a default value.
DDL таблицы показываает несколько полей с not null и отсутствем default.
В принципе, копия рабоатет как надо, требуемые поля не приходят с морды, нет их предустановленных значений, поэтому и сваливается.
Но!
Пару лет точно на исходном серваке всё работает, такой ошибки не наблюдается.
Очевидно что при переносе потерялось дефолтное значение на поле, такое бывает при переносе, если есть бэкапы системы стоит проверить это на исторических данных, но 90% что просто похерилось при дампе/заливке.
Проще всего изменить таблицу руками, добавив соответствующий атрибут.
сергей кузьмин, ThunderCat, Я понимаю, что надо модифицировать или табличку или морду.
Проект на сопровождении недавно, я прикидываю какие ещё сюрпризы можно ожидать.
Дмитрий, Тут прошу пояснить/уточнить. Запись действительно создаётся, без ругани.
На проблемных полях пустые строки.
Randel Kovalsky, это настройка, strict mode видать она у вас разная, архитектор создавал в лайт режиме, видать сервер давно и обновляли обновляли, а конфиг старый тянули, при установке на чистую в докер эта настройка в базе могла поменяться
Сделал INSERT непосредственно на SQL-сервере, запрос выполнился.
То же самое на новом окружении - ругается на поля без default значений.
Вывод - дело в базе.
Вывод - ошибочный.
MySQL имеет хренову гору настроечных переменных, значительная часть из которых может переопределяться в сессии. Обычно этим занимается коннектор к серверу БД при установлении соединения. Они определяют поведения сервера в различных ситуациях и моментах. Проблема - именно тут.
Самый трудный (но и самый надёжный) способ - это на старом и новом серверах выполнить запрос SHOW VARIABLES; (получите порядка 650 записей), сравнить вывод, выделить переменные, которые оказывают влияние на проблему, и внести соотв. исправления - либо в конфиг сервера (в секцию сервера либо клиента), либо в настройки инициализации соединения в приложении.
В вашем случае в первую очередь смотрите значение переменной sql_mode. И обратите внимание на изменения дефолтного значения и обработки текущих значений для этой переменной, связанные с версией сервера - это тоже влияет.
PS. Хотя как по мне, NOT NULL поле без указания значения по умолчанию - это бред и логический косяк. Ошибка проектирования структуры базы данных. Я бы в первую очередь исправлял именно это.