Mysql
 sql >> база данни >  >> RDS >> Mysql

Грешка в MySQL при задаване на стойност по подразбиране за DATE или DATETIME

Грешката се дължи на sql режима, който може да бъде строг режим според най-новата документация на MYSQL 5.7

Документацията на MySQL 5.7 казва :

Строгият режим засяга дали сървърът разрешава '0000-00-00' като валидна дата:Ако строг режим не е активиран, '0000-00-00' е разрешен и вмъкванията не произвеждат предупреждение. Ако строг режим е активиран, '0000- 00-00' не е разрешено и вмъкванията произвеждат грешка, освен ако не е дадено и ИГНОРИРАНЕ. За 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. За Windows това трябва да се направи в my.ini файл.

Забележка

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

MySQL ви позволява да съхранявате „нулева“ стойност от „0000-00-00“ като „фиктивна дата“. Това в някои случаи е по-удобно от използването на NULL стойности и използва по-малко данни и индексно пространство. За да забраните '0000-00-00', активирайте SQL режима NO_ZERO_DATE.

АКТУАЛИЗИРАНЕ

Относно проблема с бъговете, както каза @Dylan-Su:

Не мисля, че това е грешката в начина, по който MYSQL се развива с течение на времето, поради което някои неща се променят въз основа на по-нататъшно подобрение на продукта.

Имам обаче друг свързан доклад за грешка относно 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ръководство за проектиране на база данни за управление на блогове в MySQL

  2. Активирайте Entity Framework 6 за MySql (C#) в WinForms на Microsoft Visual Studio 2013

  3. 2 начина за изброяване на всички функции в MySQL

  4. Успешни стратегии за архивиране и възстановяване на MySQL/MariaDB

  5. ER_NOT_SUPPORTED_AUTH_MODE - MySQL сървър