Альтернатива MySQL datetime «0000-00-00 00:00:00» значение по умолчанию [дубликат]

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

Поскольку CGI-скрипты требуют прав на выполнение, httpd по умолчанию разрешает только CGI-программы в cgi-bin для запуска (возможно, в настоящее время ошибочных) целей безопасности.

Большинство скриптов PHP выполняются в процессе веб-сервера через mod_php. Это не CGI.

CGI медленный, так как программа (и связанный интерпретатор) должна быть запущена за запрос. Современные альтернативы - это встроенное исполнение, используемое mod_php и длительные процессы, используемые FastCGI. У данного языка может быть свой собственный способ реализации этих механизмов, поэтому обязательно обращайтесь к CGI.

64
задан Evhz 2 April 2016 в 14:11
поделиться

10 ответов

Ошибка возникает из-за режима 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 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 , в которой говорится, что

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

UPDATE

Что касается вопроса об ошибке, как сказано в @ 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

107
ответ дан geeksal 17 August 2018 в 21:38
поделиться
  • 1
    Действительно полезная информация, тертая для информации для автоматической инициализации! – Evhz 2 April 2016 в 16:55
  • 2
    @Karlos, если это решило ваш запрос, чем принять его. – geeksal 2 April 2016 в 17:07
  • 3
    UPDATE IGNORE - это то, что я искал – Afanasii Kurakin 26 March 2017 в 14:06
  • 4
    SET sql_mode = ''; работает – Mike 27 April 2017 в 09:04
  • 5
    Неправильно. У меня есть STRICT_TRANS_TABLES для обоих экземпляров MySQL, локальных и серверных. Тем не менее, я могу легко вставить 0000-00-00 в свой локальный экземпляр, но не могу в моем экземпляре сервера - возникает ошибка. Зачем? Потому что мой конфигуратор MySQL MySQL включен NO_ZERO_DATE. И у моего местного нет этого. – Green 21 July 2017 в 02:11
  • 6
  • 7
    – arjen Stens 23 August 2017 в 07:35

У меня была эта ошибка с 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."

12
ответ дан Aserre 17 August 2018 в 21:38
поделиться

Проблема синтаксиса конфигурации

В некоторых версиях 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

4
ответ дан Community 17 August 2018 в 21:38
поделиться

Он работает для 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.

2
ответ дан Dylan Su 17 August 2018 в 21:38
поделиться

Комбинации опций для 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:

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
0
ответ дан Green 17 August 2018 в 21:38
поделиться

Сначала выберите текущий сеанс 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 = '...';
0
ответ дан prostosmirienie 17 August 2018 в 21:38
поделиться

этот ответ просто для mysql 5.7:

лучше всего не установлен в пустое sql_mode, вместо этого использует в php переменную сеанса с:

SET SESSION sql_mode= 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

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

Сумасшедшая, что документация mysql не ясна, вам нужно удалить эти значения defeault в sql_mode:

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

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

наконец TRADITIONAL тоже, но документация говорит об этом параметре: «дайте вместо предупреждения «при вводе некорректного значения в столбец» с этим параметром даты с нулевыми значениями не вставляются, но без да

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

1
ответ дан stackdave 17 August 2018 в 21:38
поделиться

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

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

, затем sudo service mysql restart

2
ответ дан Thomas Smyth 17 August 2018 в 21:38
поделиться

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

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

0
ответ дан Vindic 17 August 2018 в 21:38
поделиться
0
ответ дан Martin T. 29 October 2018 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: