Я запускаю MySql Server 5.7.11 и это предложение:
updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
это не работает. Выдача ошибки:
ERROR 1067 (42000): Invalid default value for 'updated'
Но следующее:
updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
просто работает .
То же самое для DATE.
В качестве дополнительной заметки это упоминается в документации MySQL :
Тип DATE используется для значений с частью даты, но без части времени. MySQL извлекает и отображает значения DATE в формате «ГГГГ-ММ-ДД». Поддерживаемый диапазон: от «1000-01-01» до «9999-12-31».
даже если они также говорят:
Недопустимые значения DATE, DATETIME или TIMESTAMP преобразуются в «нулевое» значение соответствующего типа ('0000-00-00' или '0000-00-00 00:00:00').
Принимая во внимание вторую цитату из документации MySQL, может ли кто-нибудь сообщить мне, почему он дает эту ошибку?
NULL
нужно.Ответы:
Ошибка связана с режимом sql, который может быть строгим режимом в соответствии с последней документацией MYSQL 5.7.
В документации MySQL 5.7 говорится :
Чтобы проверить режим MYSQL
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
Отключение режима STRICT_TRANS_TABLES
Однако, чтобы разрешить формат,
0000-00-00 00:00:00
вы должны отключить режим STRICT_TRANS_TABLES в файле конфигурации mysql или с помощью командыПо команде
SET sql_mode = '';
или
SET GLOBAL sql_mode = '';
Использование ключевого слова
GLOBAL
требует суперпредложений и влияет на операции, которые с этого момента подключаются все клиенты.если указанное выше не работает, перейдите к
/etc/mysql/my.cnf
(согласно ubuntu) и закомментируйтеSTRICT_TRANS_TABLES
Кроме того, если вы хотите постоянно устанавливать режим sql при запуске сервера, включите его
SET sql_mode=''
вmy.cnf
Linux или MacOS. Для окон это должно быть сделано вmy.ini
файле.Заметка
Однако строгий режим не включен по умолчанию в MYSQL 5.6. Следовательно, он не вызывает ошибку согласно документации MYSQL 6, в которой говорится
ОБНОВИТЬ
Что касается ошибки, как сказал @ Dylan-Su:
Я не думаю, что это ошибка в том, как MYSQL развивается с течением времени, из-за чего некоторые вещи меняются в зависимости от дальнейшего улучшения продукта.
Однако у меня есть еще один отчет об ошибке, связанный с
NOW()
функциейПоле даты и времени не принимает значение по умолчанию NOW ()
Еще одно полезное примечание [см. Автоматическая инициализация и обновление для TIMESTAMP и DATETIME ]
Обновление касательно NO_ZERO_DATE
Начиная с MySQL 5.7.4 этот режим устарел. Для предыдущей версии вы должны закомментировать соответствующую строку в файле конфигурации. Обратитесь к документации MySQL 5.7 на NO_ZERO_DATE
источник
STRICT_TRANS_TABLES
оба экземпляра MySQL, локальный и серверный. Однако я могу легко вставить0000-00-00
в свой локальный экземпляр, но не могу в свой экземпляр сервера - возникает ошибка. Зачем? Поскольку моя конфигурация MySQL сервераNO_ZERO_DATE
включена. А у моего местного нет.NO_ZERO_DATE
следует удалитьУ меня была эта ошибка с WAMP 3.0.6 с MySql 5.7.14.
Решение :
измените строку 70 (если ваш ini-файл не затронут) в
c:\wamp\bin\mysql\mysql5.7.14\my.ini
файле изв
и перезапустите все службы.
Это отключит строгий режим. Согласно документации, «строгий режим» означает режим с одного или обоих
STRICT_TRANS_TABLES
илиSTRICT_ALL_TABLES
включен. В документации говорится:источник
Я попал в ситуацию, когда данные были смешаны между NULL и 0000-00-00 для поля даты. Но я не знал, как обновить '0000-00-00' до NULL, потому что
больше не допускается. Мое обходное решение было довольно простым:
потому что все неверные
my_date_field
значения (правильные или неправильные даты) были до этой даты.источник
<'0000-01-01'
поскольку это, конечно, действительная дата.Проблема с синтаксисом конфигурации
В некоторых версиях MYSQL (проверенных 5.7. *) В системах * nix вы должны использовать этот синтаксис:
Это не сработает:
без кавычек
подчеркивание без кавычек
подчеркивание и кавычки
Более полный обзор значений конфигурации и sql-режима:
Как установить постоянные флаги режима Sql
источник
Сначала выберите текущий сеанс
sql_mode
:Тогда вы получите что-то вроде этого значения по умолчанию :
а затем установить
sql_mode
без'NO_ZERO_DATE'
:Если у вас есть гранты, вы также можете сделать это на
GLOBAL
:источник
Просто добавьте строку:
sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
внутри файла:
/etc/mysql/mysql.conf.d/mysqld.cnf
затем
sudo service mysql restart
источник
SELECT @@SESSION.sql_mode;
сначала удалить NO_ZERO_IN_DATE, NO_ZERO_DATE и STRICT_TRANS_TABLES из того, что он вам дает. Таким образом вы сохраните все остальные настройки, которые вы включили. У меня было гораздо больше, чем просто эти два элемента, установленные для моего режима sql. Не знаю, что они все делают, но я не хочу рисковать удалением их сейчас.Работает на 5.7.8:
Вы можете создать SQLFiddle, чтобы воссоздать вашу проблему.
http://sqlfiddle.com/
Если он работает для MySQL 5.6 и 5.7.8, но не работает на 5.7.11. Тогда, вероятно, это ошибка регресса для 5.7.11.
источник
Чтобы решить проблему с MySQL Workbench (после применения решения на стороне сервера):
Удалите SQL_MODE на TRADITIONAL на панели настроек.
источник
Этот ответ предназначен только для MySQL 5.7:
На самом деле Best не указывается в пустом sql_mode, вместо этого используйте в PHP переменную сеанса с:
По крайней мере, вы сохраняете другие значения по умолчанию.
Это безумие, что документация mysql не ясна, вам нужно удалить эти значения по умолчанию в sql_mode:
NO_ZERO_IN_DATE, NO_ZERO_DATE, я понимаю, но в будущих версиях это будет прекращено.
STRICT_ALL_TABLES, с этим, прежде чем параметры будут проигнорированы, поэтому вам также необходимо удалить его.
Наконец, тоже ТРАДИЦИОННЫЙ, но в документации говорится об этом параметре: «выдавать ошибку вместо предупреждения» при вставке неверного значения в столбец », с этим параметром даты с нулевыми значениями не вставляются, а без да.
MySQL на самом деле не организован с этими параметрами и комбинациями.
источник
Комбинации вариантов для
mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64)
.Не бросает:
STRICT_TRANS_TABLES
+NO_ZERO_DATE
Броски:
STRICT_TRANS_TABLES
+NO_ZERO_IN_DATE
Мои настройки в
/etc/mysql/my.cnf
Ubuntu:источник
источник
В директории xamp / mysql / bin Откройте "my.ini" и измените строку: Sql_node for ->
"Sql_mode = NO_ENGINE_SUBSTITUTION, NO_ZERO_DATE"
УДАЛИТЬ "NO_ZERO_IN_DATE"
источник