sql >> Database >  >> RDS >> Mysql

Fout in MySQL bij het instellen van de standaardwaarde voor DATE of DATETIME

De fout is vanwege de sql-modus, die strikte modus kan zijn volgens de laatste MYSQL 5.7-documentatie

MySQL-documentatie 5.7 zegt :

Strikte modus beïnvloedt of de server '0000-00-00' als een geldige datum toestaat:Als de strikte modus niet is ingeschakeld, is '0000-00-00' toegestaan ​​en geven invoegingen geen waarschuwing. Als de strikte modus is ingeschakeld, wordt '0000- 00-00' is niet toegestaan ​​en invoegingen geven een fout, tenzij ook IGNORE wordt gegeven. Voor INSERT IGNORE en UPDATE IGNORE is '0000-00-00' toegestaan ​​en invoegingen geven een waarschuwing.

MYSQL-modus controleren

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

STRICT_TRANS_TABLES-modus uitschakelen

Echter om het formaat 0000-00-00 00:00:00 . toe te staan je moet de STRICT_TRANS_TABLES-modus uitschakelen in het mysql-configuratiebestand of met een opdracht

Op bevel

SET sql_mode = '';

of

SET GLOBAL sql_mode = '';

Het trefwoord GLOBAL . gebruiken vereist super previliges en het beïnvloedt de operaties die alle clients vanaf dat moment verbinden

als bovenstaande niet werkt, ga dan naar /etc/mysql/my.cnf (volgens ubuntu) en reageer STRICT_TRANS_TABLES

Als u de sql-modus permanent wilt instellen bij het opstarten van de server, voeg dan SET sql_mode='' toe in my.cnf op Linux of MacOS. Voor Windows moet dit worden gedaan in my.ini bestand.

Opmerking

De strikte modus is echter niet standaard ingeschakeld in MYSQL 5.6. Daarom produceert het niet de fout volgens MYSQL 6-documentatie die zegt

Met MySQL kunt u een "nul"-waarde van '0000-00-00' opslaan als een "dummy-datum". Dit is in sommige gevallen handiger dan het gebruik van NULL-waarden en gebruikt minder gegevens en indexruimte. Om '0000-00-00' niet toe te staan, schakelt u de NO_ZERO_DATE SQL-modus in.

UPDATE

Wat betreft de bugkwestie zoals gezegd door @Dylan-Su:

Ik denk niet dat dit de bug is, het is de manier waarop MYSQL in de loop van de tijd is geëvolueerd, waardoor sommige dingen zijn veranderd op basis van verdere verbetering van het product.

Ik heb echter nog een ander gerelateerd bugrapport met betrekking tot de NOW() functie

Datetime-veld accepteert geen standaard NU()

Nog een nuttige opmerking [zie Automatische initialisatie en update voor TIMESTAMP en DATETIME ]

Vanaf MySQL 5.6.5 kunnen de kolommen TIMESTAMP en DATETIME automatisch worden geïnitialiseerd en bijgewerkt naar de huidige datum en tijd (dat wil zeggen, de huidige tijdstempel). Vóór 5.6.5 geldt dit alleen voor TIMESTAMP en voor maximaal één TIMESTAMP-kolom per tabel. De volgende opmerkingen beschrijven eerst de automatische initialisatie en update voor MySQL 5.6.5 en hoger, daarna de verschillen voor versies vóór 5.6.5.

Update betreffende NO_ZERO_DATE

Vanaf MySQL vanaf 5.7.4 is deze modus verouderd. Voor de vorige versie moet u commentaar geven op de respectieve regel in het configuratiebestand. Raadpleeg MySQL 5.7-documentatie op NO_ZERO_DATE



  1. Onbewerkte SQL-querystring ophalen uit door PDO voorbereide instructies

  2. Wat is een logische OF-operator in SQL Server - SQL Server / TSQL-zelfstudie, deel 119

  3. Dynamische SQL (EXECUTE) als voorwaarde voor IF-statement

  4. Oracle getVerbinding traag