У меня два вопроса:
0000-00-00, если в определении таблицы ее значение не равно нулю ..?пример схемы: здесь
Теперь, если изменить duedate на 1970-01-01, появится ошибка.
Incorrect date value
0000-00-00for the column duedate at row1
update my_list set duedate = '1970-01-01' where duedate = '0000-00-00';
Я попытался изменить столбец, но он по-прежнему показывает ту же ошибку
ALTER TABLE `my_list` modify `duedate` date NULL;
ALTER TABLE `my_list` MODIFY `duedate` DATE NOT NULL DEFAULT '1970-01-01';
1970-01-01 для 0000-00-00;Я получил базу данных от клиента, поэтому, к сожалению, работаю с файлом my.cnf.
Больше информации:
Версия MYSQL: 5.5
Обновлено: Это работает
update my_list set duedate = '1970-01-01' where id = 16;
но нет
update my_list set duedate = '1970-01-01' where duedate = '0000-00-00';
он работает с использованием select * from my_list where duedate = '0000-00-00';, к сожалению, он не работает в sqlfiddle, но работает в SQL WORK BENCH. Я хотел поменять на 1970
сделать SET sql_mode = ''; перед вызовом запроса на обновление






Вы не можете изменять и обновлять значение даты на «0000-00-00» в качестве фиктивной даты. из-за того, что MySQL позволяет вам хранить «нулевое» значение. Чтобы запретить «0000-00-00», включите режим SQL NO_ZERO_DATE.
Дополнительно должен быть включен строгий режим для запрета «нулевых» значений:
Проверить версию и режим SQL
SELECT version();
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
Отключение режима STRICT_TRANS_TABLES
вам нужно отключить режим STRICT_TRANS_TABLES в файле конфигурации mysql или с помощью команды
По команде
SET sql_mode = '';
или
SET GLOBAL sql_mode = '';
если выше не работает, перейдите в /etc/mysql/my.cnf (согласно ubuntu) и закомментируйте STRICT_TRANS_TABLES
Кроме того, если вы хотите навсегда установить режим sql при запуске сервера, включите SET sql_mode = '' в my.cnf в Linux. Для Windows это нужно сделать в файле my.ini.
если выше не работает, перейдите в /etc/mysql/my.cnf (согласно ubuntu) и закомментируйте STRICT_TRANS_TABLES
Кроме того, если вы хотите навсегда установить режим sql при запуске сервера, включите SET sql_mode = '' в my.cnf в Linux. Для Windows это нужно сделать в файле my.ini.
Примечание
MySQL позволяет вам хранить «нулевое» значение «0000-00-00» в качестве «фиктивной даты». В некоторых случаях это более удобно, чем использование значений NULL, и требует меньше данных и места для индекса. Чтобы запретить «0000-00-00», включите режим SQL NO_ZERO_DATE.
Обновление по поводу NO_ZERO_DATE
Начиная с MySQL 5.7.4 этот режим устарел. Обратитесь к документации MySQL 5.7 на NO_ZERO_DATE
спасибо за объяснение, но, к сожалению, у меня нет надлежащих прав на базу данных для запуска set sql_mode=''; или изменения файла my.cnf.
Хорошо, я поговорил с клиентом сегодня, и я могу внести изменения в файл my.cnf, и потому что sql_mode установлен в NULL, операторы вставки не проверяли нулевые значения с помощью `STRICT_ALL_TABLES`, теперь я могу убедиться, что данные правильные, и данные будут отклонены при вставке неправильных данных.
Удаление STRICT_TRANS_TABLES помогло мне решить аналогичную проблему. Оказалось, что настройка среды с последней версией MySQL сильно отличается от устаревшей версии 5.6. Спасибо!
Это работает
update my_list
set duedate = '1970-01-01'
where to_days(duedate)IS NULL
хотя бы в sqlfiddle
спасибо, что вышеупомянутый запрос работает, и я могу изменить дату .. Однако я все еще не понимаю его why does not the insert statement notify an error when inserting wrong date value but it notifies when using update statement?
Приведите duedate к строке:
update my_list set duedate = '1970-01-01' where DATE_FORMAT(duedate, '%Y-%m-%d') = '0000-00-00';
Этот запрос тоже работает .. я могу изменить дату .. однако why does not the insert statement notify an error when inserting wrong date value but it notifies when using update statement?
Даже если они похожи, MySql внутренне выполняет две разные операции и, вероятно, не выполняет одну и ту же проверку.
Работает отлично. Ty
Поскольку
'0000-00-00'не является правильным значением даты, вы не можете использовать его в своем предложенииwhere. А зачем менять на1970?NULL- правильное значение без даты