Я запускаю 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'

просто работает.

Тот же случай для ДАТЫ.

В качестве примечанияон упоминается в документации MySQL:

Тип DATE используется для значений с частью даты, но без части времени. MySQL извлекает и отображает значения DATE в формате «ГГГГ-ММ-ДД». Поддерживаемый диапазон: от «1000-01-01» до «9999-12-31».

даже если они также говорят:

Недействительные значения DATE, DATETIME или TIMESTAMP преобразуются в «нулевое» значение соответствующего типа ('0000-00-00' или '0000-00-00 00:00:00').

Принимая во внимание вторую цитату из документации MySQL, может ли кто-нибудь сообщить мне, почему он выдает эту ошибку?

Evhz

Ответов: 15

Ответы (15)

Ошибка из-за режима sql, который может быть строгим режимом согласно последней документации MYSQL 5.7

В документации MySQL 5.7 указано:

Строгий режим влияет на то, разрешает ли сервер «0000-00-00» как действительную дату: Если строгий режим не включен, разрешен «0000-00-00», и вставки не вызывают предупреждений. Если включен строгий режим, «0000-00-00» не разрешен, и вставки вызывают ошибку, если также не задано IGNORE. Для INSERT IGNORE и UPDATE IGNORE разрешено '0000-00-00', а вставки выдают предупреждение.

Чтобы проверить режим MYSQL

SELECT @@ GLOBAL.sql_mode global, @@ SESSION.sql_mode сеанс

Отключение режима STRICT_TRANS_TABLES

Однако, чтобы разрешить формат 0000-00-00 00: 00: 00, вам необходимо отключить режим STRICT_TRANS_TABLES в файле конфигурации mysql или с помощью команды

По команде

УСТАНОВИТЬ sql_mode = '';

или

УСТАНОВИТЬ ГЛОБАЛЬНЫЙ sql_mode = '';

Использование ключевого слова GLOBAL требует суперпредложений и влияет на операции, которые все клиенты подключаются с этого момента на

, если указанное выше не работает, перейдите к / etc / mysql / my.cnf (согласно ubuntu) и закомментируйте STRICT_TRANS_TABLES

Кроме того, если вы хотите навсегда установить режим sql при запуске сервера, включите SET sql_mode = '' в my.cnf в Linux или MacOS. Для Windows это нужно сделать в файле my.ini.

Примечание

Однако строгий режим не включен по умолчанию в MYSQL 5.6. Следовательно, он не вызывает ошибку в соответствии с документацией MYSQL 6, в которой говорится

MySQL позволяет вам хранить «нулевое» значение «0000-00-00» как «фиктивную дату». В некоторых случаях это более удобно, чем использование значений NULL, и требует меньше данных и места для индекса. Чтобы запретить «0000-00-00», включите режим SQL NO_ZERO_DATE.

ОБНОВЛЕНИЕ

Что касается ошибки, как сказал @ Dylan-Su:

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

Однако у меня есть еще один связанный отчет об ошибке, касающийся функции NOW ()

Поле Datetime не принимает значение по умолчанию NOW ()

Другое полезное примечание [см. Автоматическая инициализация и обновление для TIMESTAMP и DATETIME]

Начиная с MySQL 5.6.5, столбцы TIMESTAMP и DATETIME могут быть автоматически инициализированы и обновлены до текущей даты и времени (то есть текущей метки времени). До версии 5.6.5 это верно только для TIMESTAMP и не более одного столбца TIMESTAMP в таблице. Следующие ниже примечания сначала описывают автоматическую инициализацию и обновление для MySQL 5.6.5 и выше, а затем различия для версий, предшествующих 5.6.5.

Обновление относительно NO_ZERO_DATE

Начиная с MySQL 5.7.4 этот режим устарел. Для предыдущей версии вы должны закомментировать соответствующую строку в файле конфигурации. Обратитесь к документации MySQL 5.7 на NO_ZERO_DATE

В каталоге xampp / mysql / bin Откройте «my.ini» и измените строку: sql_mode на ->

"sql_mode=NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE"

REMOVE "NO_ZERO_IN_DATE"

Выберите базу данных и выполните SQL-запрос:

SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session

Я попал в ситуацию, когда данные были смешаны между NULL и 0000-00-00 для поля даты. Но я не знал, как обновить '0000-00-00' до NULL, потому что

 update my_table set my_date_field=NULL where my_date_field='0000-00-00'

больше не допускается. Мое обходное решение было довольно простым:

update my_table set my_date_field=NULL where my_date_field<'0000-01-01'

, потому что все неверные значения my_date_field (правильные или неправильные даты) были до этой даты.

Просто добавьте строку: sql_mode = "NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"

внутри файла: / etc / mysql / mysql.conf.d / mysqld.cnf

затем sudo service mysql restart

Сначала выберите текущий сеанс sql_mode:

SELECT @@SESSION.sql_mode;

Тогда вы получите что-то вроде этого значение по умолчанию:

'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'

, а затем установите sql_mode без 'NO_ZERO_DATE':

SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

Если у вас есть гранты, вы можете сделать это также за GLOBAL:

SELECT @@GLOBAL.sql_mode;
SET GLOBAL sql_mode = '...';
set global sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

Я протестировал следующее исправление:

1). On the file "system/library/db/mysqli.php" search and comment the line: 
"$this->connection->query("SET SESSION sql_mode = 'NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION'");"

2) Add the following line above the one you just commented:
// Correction by Added by A.benkorich
$this->connection->query("SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY'");

1. Используйте следующую команду, чтобы изменить дату по умолчанию на current_timestamp: -

  ALTER TABLE `wp_posts` CHANGE `post_date` `post_date`  DATETIME NOT
  NULL DEFAULT CURRENT_TIMESTAMP

2. Используйте следующую команду, чтобы изменить дату по умолчанию на NULL: -

 ALTER TABLE `wp_posts` CHANGE `post_date` `post_date`  DATETIME NOT
 NULL DEFAULT NULL

3. Используйте следующую команду, чтобы изменить дату по умолчанию для более чем 1 столбца с использованием одного запроса SQL: -

ALTER TABLE `wp_posts`  CHANGE `post_date` `post_date` DATETIME NOT NULL 
DEFAULT CURRENT_TIMESTAMP, CHANGE `post_date_gmt` `post_date_gmt` 
DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, CHANGE `post_modified` 
`post_modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, CHANGE 
`post_modified_gmt` `post_modified_gmt` DATETIME NOT NULL DEFAULT 
 CURRENT_TIMESTAMP;

Комбинации опций для mysql Ver 14.14 Distrib 5.7.18, для Linux (x86_64).

Не бросает:

STRICT_TRANS_TABLES + NO_ZERO_DATE

Броски:

STRICT_TRANS_TABLES + NO_ZERO_IN_DATE

Мои настройки в / etc / mysql / my.cnf в Ubuntu:

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

Для решения проблемы с MySQL Workbench (после применения решения на стороне сервера):

Удалите SQL_MODE на TRADITIONAL на панели настроек.

enter image description here

Работает на 5.7.8:

mysql> create table t1(updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00');
Query OK, 0 rows affected (0.01 sec)

mysql> show create table t1;
+-------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                            |
+-------+-------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.8-rc  |
+-----------+
1 row in set (0.00 sec)

Вы можете создать SQLFiddle, чтобы воссоздать вашу проблему.

http://sqlfiddle.com/

Если это работает для MySQL 5.6 и 5.7.8, но не работает на 5.7.11. Тогда это, вероятно, ошибка регрессии для 5.7.11.

У меня была эта ошибка с WAMP 3.0.6 с MySql 5.7.14.

Решение:

изменить строку 70 (если ваш ini-файл не был затронут) в c: \ wamp \ bin \ mysql \ mysql5.7.14 \ my.ini файл из

sql-mode= "STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
От

до

sql-mode="ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"

и перезапустите все службы.

Это отключит строгий режим. Согласно документации, «строгий режим» означает режим, в котором включен один или оба параметра STRICT_TRANS_TABLES или STRICT_ALL_TABLES. В документации написано:

"Режим SQL по умолчанию в MySQL 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:

На самом деле Best не указывается в пустом sql_mode, вместо этого используйте в PHP переменную сеанса с:

SET SESSION sql_mode= 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

Значит, вы, по крайней мере, сохраняете другие значения по умолчанию.

Это безумие, что документация mysql непонятна, вам нужно удалить эти значения по умолчанию в sql_mode:

NO_ZERO_IN_DATE, NO_ZERO_DATE, я понимаю, но в будущих версиях это будет прекращено.

STRICT_ALL_TABLES, при этом параметры перед будут проигнорированы, поэтому вам также необходимо удалить его.

Наконец-то тоже ТРАДИЦИОННЫЙ, но об этом параметре говорится в документации: «выдавать ошибку вместо предупреждения» при вставке неверного значения в столбец », с этим параметром даты с нулевыми значениями не вставляются, а без да.

MySQL на самом деле не организован с этими параметрами и комбинациями.

Ошибка синтаксиса конфигурации

В некоторых версиях MYSQL (проверено 5.7. *) В системах * nix вы должны использовать этот синтаксис:

[mysqld]

sql-mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_ENGINE_SUBSTITUTION"

Не работают:

тире без кавычек

sql-mode=NO_ENGINE_SUBSTITUTION

подчеркивание без кавычек

sql_mode=NO_ENGINE_SUBSTITUTION

подчеркивание и кавычки

sql_mode="NO_ENGINE_SUBSTITUTION"

Более полный обзор значений конфигурации и sql-режима:

Как установить постоянные флаги Sql Mode

2022 WebDevInsider