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

Errore in MySQL durante l'impostazione del valore predefinito per DATE o DATETIME

L'errore è dovuto alla modalità sql che può essere modalità rigorosa secondo l'ultima documentazione di MySQL 5.7

La documentazione MySQL 5.7 dice :

La modalità rigorosa influisce sul fatto che il server consenta '0000-00-00' come data valida:se la modalità rigorosa non è abilitata, '0000-00-00' è consentito e gli inserimenti non producono alcun avviso. Se la modalità rigorosa è abilitata, '0000- 00-00' non è consentito e gli inserti producono un errore, a meno che non venga indicato anche IGNORE. Per INSERT IGNORE e UPDATE IGNORE, '0000-00-00' è consentito e gli inserti producono un avviso.

Per controllare la modalità MySQL

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

Disattivazione della modalità STRICT_TRANS_TABLES

Tuttavia per consentire il formato 0000-00-00 00:00:00 devi disabilitare la modalità STRICT_TRANS_TABLES nel file di configurazione mysql o tramite comando

Per comando

SET sql_mode = '';

o

SET GLOBAL sql_mode = '';

Utilizzando la parola chiave GLOBAL richiede super privilegi e influisce sulle operazioni che tutti i client si connettono da quel momento in poi

se sopra non funziona, vai su /etc/mysql/my.cnf (come per Ubuntu) e commenta STRICT_TRANS_TABLES

Inoltre, se desideri impostare in modo permanente la modalità sql all'avvio del server, includi SET sql_mode='' in my.cnf su Linux o MacOS. Per Windows questo deve essere fatto in my.ini file.

Nota

Tuttavia, la modalità rigorosa non è abilitata per impostazione predefinita in MySQL 5.6. Quindi non produce l'errore come da Documentazione di MySQL 6 che dice

MySQL ti consente di memorizzare un valore "zero" di "0000-00-00" come "data fittizia". Questo è in alcuni casi più conveniente rispetto all'utilizzo di valori NULL e utilizza meno dati e spazio nell'indice. Per non consentire '0000-00-00', abilitare la modalità SQL NO_ZERO_DATE.

AGGIORNAMENTO

Per quanto riguarda la questione del bug come detto da @Dylan-Su:

Non credo che questo sia il bug nel modo in cui MySQL si è evoluto nel tempo a causa del quale alcune cose sono cambiate in base all'ulteriore miglioramento del prodotto.

Tuttavia ho un'altra segnalazione di bug relativa a NOW() funzione

Il campo Data/ora non accetta il valore predefinito ORA()

Un'altra nota utile [vedi Inizializzazione e aggiornamento automatici per TIMESTAMP e DATETIME ]

A partire da MySQL 5.6.5, le colonne TIMESTAMP e DATETIME possono essere inizializzate e aggiornate automaticamente alla data e all'ora correnti (ovvero il timestamp corrente). Prima della 5.6.5, questo valeva solo per TIMESTAMP e per al massimo una colonna TIMESTAMP per tabella. Le note seguenti descrivono prima l'inizializzazione e l'aggiornamento automatici per MySQL 5.6.5 e versioni successive, quindi le differenze per le versioni precedenti alla 5.6.5.

Aggiornamento relativo a NO_ZERO_DATE

A partire da MySQL a partire dalla 5.7.4 questa modalità è deprecata. Per la versione precedente è necessario commentare la rispettiva riga nel file di configurazione. Fare riferimento alla documentazione MySQL 5.7 su NO_ZERO_DATE