sql >> Databáze >  >> RDS >> Mysql

Chyba v MySQL při nastavování výchozí hodnoty pro DATE nebo DATETIME

Chyba je způsobena režimem sql, který může být přísný režim podle nejnovější dokumentace MYSQL 5.7

Dokumentace MySQL 5.7 říká :

Přísný režim ovlivňuje, zda server povolí '0000-00-00' jako platné datum:Pokud přísný režim není povolen, je povoleno '0000-00-00' a vkládání nevytváří žádné varování. Pokud je povolen přísný režim, '0000- 00-00' není povoleno a inserty generují chybu, pokud není zadáno také IGNORE. Pro INSERT IGNORE a UPDATE IGNORE je povoleno '0000-00-00' a vložky vytvářejí varování.

Kontrola režimu MYSQL

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

Deaktivace režimu STRICT_TRANS_TABLES

Chcete-li však povolit formát 0000-00-00 00:00:00 musíte deaktivovat režim STRICT_TRANS_TABLES v konfiguračním souboru mysql nebo příkazem

Příkazem

SET sql_mode = '';

nebo

SET GLOBAL sql_mode = '';

Pomocí klíčového slova GLOBAL vyžaduje super privilegia a ovlivňuje operace, které se od té doby všichni klienti připojují

pokud výše uvedené nefunguje, přejděte na /etc/mysql/my.cnf (podle ubuntu) a zakomentujte STRICT_TRANS_TABLES

Také, pokud chcete trvale nastavit sql režim při spuštění serveru, zahrňte SET sql_mode='' v my.cnf na Linuxu nebo MacOS. Pro Windows to musí být provedeno v my.ini soubor.

Poznámka

Přísný režim však není ve výchozím nastavení v MYSQL 5.6 povolen. Proto nevytváří chybu podle Dokumentace MYSQL 6 který říká

MySQL vám umožňuje uložit „nulovou“ hodnotu „0000-00-00“ jako „fiktivní datum“. To je v některých případech pohodlnější než použití hodnot NULL a využívá méně dat a indexového prostoru. Chcete-li zakázat '0000-00-00', povolte režim SQL NO_ZERO_DATE.

AKTUALIZACE

Pokud jde o chybu, jak řekl @Dylan-Su:

Nemyslím si, že to je chyba ve způsobu, jakým se MYSQL vyvíjel v průběhu času, kvůli kterému se některé věci mění na základě dalšího zlepšování produktu.

Mám však další související hlášení o chybě týkající se NOW() funkce

Pole Datum a čas nepřijímá výchozí NOW()

Další užitečná poznámka [viz Automatická inicializace a aktualizace pro TIMESTAMP a DATETIME ]

Od MySQL 5.6.5 lze sloupce TIMESTAMP a DATETIME automaticky inicializovat a aktualizovat na aktuální datum a čas (tj. aktuální časové razítko). Před verzí 5.6.5 to platí pouze pro TIMESTAMP a maximálně pro jeden sloupec TIMESTAMP na tabulku. Následující poznámky nejprve popisují automatickou inicializaci a aktualizaci pro MySQL 5.6.5 a vyšší, poté rozdíly pro verze předcházející 5.6.5.

Aktualizace týkající se NO_ZERO_DATE

Od MySQL od 5.7.4 je tento režim zastaralý. U předchozí verze musíte zakomentovat příslušný řádek v konfiguračním souboru. Přečtěte si dokumentaci MySQL 5.7 dne NO_ZERO_DATE



  1. Datový model dodávky potravin

  2. Jak získat aktuální datum v MySQL

  3. Jak rozdělit řetězec v PostgreSQL

  4. Jak poslat výsledky dotazu e-mailem jako přílohu v SQL Server (T-SQL)