CGI - это механизм, посредством которого веб-сервер вызывает внешнюю программу для обработки запроса, причем переменные среды и стандартный ввод используются для подачи данных запроса в программу. Точный язык, на котором написана внешняя программа, не имеет значения, хотя проще писать программы CGI на некоторых языках по сравнению с другими.
Поскольку CGI-скрипты требуют прав на выполнение, httpd по умолчанию разрешает только CGI-программы в cgi-bin
для запуска (возможно, в настоящее время ошибочных) целей безопасности.
Большинство скриптов PHP выполняются в процессе веб-сервера через mod_php
. Это не CGI.
CGI медленный, так как программа (и связанный интерпретатор) должна быть запущена за запрос. Современные альтернативы - это встроенное исполнение, используемое mod_php и длительные процессы, используемые FastCGI. У данного языка может быть свой собственный способ реализации этих механизмов, поэтому обязательно обращайтесь к CGI.
Ошибка возникает из-за режима 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
У меня была эта ошибка с 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. *) в системах * 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-режима:
Он работает для 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 для воссоздания вашей проблемы.
Если он работает для MySQL 5.6 и 5.7.8, но не работает на 5.7.11. Тогда это, вероятно, будет ошибкой регрессии для 5.7.11.
Комбинации опций для 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"
Сначала выберите текущий сеанс 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 = '...';
этот ответ просто для 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 на самом деле не организован с этими параметрами и комбинациями.
Просто добавьте строку: sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
внутри файла: /etc/mysql/mysql.conf.d/mysqld.cnf
, затем sudo service mysql restart
Чтобы решить проблему с MySQL Workbench (после применения решения на стороне сервера):
Удалите SQL_MODE в TRADITIONAL на панели настроек.
STRICT_TRANS_TABLES
для обоих экземпляров MySQL, локальных и серверных. Тем не менее, я могу легко вставить0000-00-00
в свой локальный экземпляр, но не могу в моем экземпляре сервера - возникает ошибка. Зачем? Потому что мой конфигуратор MySQL MySQL включенNO_ZERO_DATE
. И у моего местного нет этого. – Green 21 July 2017 в 02:11