sql >> Database teknologi >  >> RDS >> Mysql

Fejl i MySQL ved indstilling af standardværdi for DATE eller DATETIME

Fejlen er på grund af sql-tilstanden, som kan være streng tilstand ifølge den seneste MYSQL 5.7-dokumentation

MySQL-dokumentation 5.7 siger :

Strikt tilstand påvirker, om serveren tillader '0000-00-00' som en gyldig dato:Hvis streng tilstand ikke er aktiveret, er '0000-00-00' tilladt, og indsættelser giver ingen advarsel. Hvis streng tilstand er aktiveret, '0000- 00-00' er ikke tilladt, og indsættelser giver en fejl, medmindre der også er angivet IGNORE. For INSERT IGNORE og UPDATE IGNORE er '0000-00-00' tilladt, og indsættelser giver en advarsel.

For at kontrollere MYSQL-tilstand

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

Deaktiverer STRICT_TRANS_TABLES-tilstand

Men for at tillade formatet 0000-00-00 00:00:00 du skal deaktivere STRICT_TRANS_TABLES-tilstand i mysql-konfigurationsfilen eller ved kommando

På kommando

SET sql_mode = '';

eller

SET GLOBAL sql_mode = '';

Brug af søgeordet GLOBAL kræver super previliges, og det påvirker de operationer, som alle klienter forbinder fra det tidspunkt af

hvis ovenstående ikke virker, så gå til /etc/mysql/my.cnf (i henhold til ubuntu) og kommenter STRICT_TRANS_TABLES

Hvis du vil indstille sql-tilstanden permanent ved serverstart, skal du også inkludere SET sql_mode='' i my.cnf på Linux eller MacOS. For Windows skal dette gøres i my.ini fil.

Bemærk

Men streng tilstand er ikke aktiveret som standard i MYSQL 5.6. Derfor producerer den ikke fejlen i henhold til MYSQL 6-dokumentation som siger

MySQL tillader dig at gemme en "nul" værdi på '0000-00-00' som en "dummy-dato." Dette er i nogle tilfælde mere praktisk end at bruge NULL-værdier og bruger mindre data og indeksplads. For at afvise '0000-00-00' skal du aktivere NO_ZERO_DATE SQL-tilstand.

OPDATERING

Angående fejlspørgsmålet som sagt af @Dylan-Su:

Jeg tror ikke, at dette er fejlen, det er den måde, hvorpå MYSQL har udviklet sig over tid, på grund af hvilken nogle ting er ændret baseret på yderligere forbedring af produktet.

Men jeg har en anden relateret fejlrapport vedrørende NOW() funktion

Datetime-feltet accepterer ikke standard NOW()

En anden nyttig bemærkning [se Automatisk initialisering og opdatering for TIMESTAMP og DATETIME ]

Fra og med MySQL 5.6.5 kan kolonnerne TIMESTAMP og DATETIME automatisk initialiseres og opdateres til den aktuelle dato og klokkeslæt (det vil sige det aktuelle tidsstempel). Før 5.6.5 gælder dette kun for TIMESTAMP, og for højst én TIMESTAMP-kolonne pr. tabel. De følgende noter beskriver først automatisk initialisering og opdatering for MySQL 5.6.5 og nyere, derefter forskellene for versioner før 5.6.5.

Opdatering vedrørende NO_ZERO_DATE

Fra og med MySQL fra 5.7.4 er denne tilstand forældet. For tidligere version skal du kommentere den respektive linje i konfigurationsfilen. Se MySQL 5.7-dokumentation den NO_ZERO_DATE



  1. SQL opdelt kommasepareret række

  2. MariaDB ROWNUM() Forklaret

  3. MySQL -- Forenes mellem databaser på forskellige servere ved hjælp af Python?

  4. Hvad er forskellen mellem =null og IS NULL?