Domanda

Ho una colonna creata come

`date_start` datetime NOT NULL DEFAULT '1970-01-01'

Tuttavia quando ho caricare i dati da un file CSV con il comando LOAD DATA con una voce vuota per date_start il valore salvato è 0000-00-00 00:00:00?

È stato utile?

Soluzione

Il modo MySQL SQL per impostazione predefinita consente a zero date.

La mia convinzione è che il comando LOAD DATA INFILE sta leggendo la posizione vuota destinata ad essere una DATETIME, e automaticamente utilizzando una data zero prima dell'inserimento. Questo spiegherebbe il motivo per cui non viene applicato il tuo vincolo predefinito -. Il valore non è nullo quando viene inserita

Credo che si hanno due opzioni:

  1. Aggiorna tutti gli spazi vuoti nel CSV da "," a "null, "o", default", in modo da essere interpretati correttamente
  2. di cambiare la modalità di SQL : SET SQL_MODE='NO_ZERO_DATE'

Altri suggerimenti

NULL e 'una voce vuota' non sempre sono trattati allo stesso modo in MySql. Nel caso del tipo di dati datetime, voci vuote vengono convertiti automaticamente 0000-00-00 00:00:00. Si può pensare a questo come una forma di fusione di caratteri, in cui un vuoto ottiene typecast a zero.

Nel file di dati, provare a sostituire tutte le date in bianco con la parola chiave DEFAULT.

datetime significa che la vostra colonna memorizza data e l'ora in formato Y-m-d H:i:s (0000-00-00 00:00:00).

date significa che i negozi delle colonne appena data nel formato Y-m-d (0000-00-00).

Se non si specifica un valore durante l'inserimento dei dati, il valore predefinito viene utilizzato, ma quando inserire i dati dal file CSV esso specificare un valore per il campo, in modo che il default non viene utilizzato.

Una voce vuota è un valore non valido per un campo datetime, quindi il valore 0000-00-00 00:00:00 viene usato invece, proprio come con qualsiasi valore che non può essere analizzato per una data valida (o una data parziale).

MySQL ha il comportamento fastidioso (a mio parere) che in alcune circostanze, se dato un valore non valido per memorizzare in una colonna, si memorizzare un predefinito "valore di errore", invece. Per esempio, in una data o datetime contesto, memorizzerà la "data zero" avete notato; per una colonna ENUM immagazzinerà '' (corrisponde a 0 in un contesto numerico) come un valore di errore.

Anche se è poco elegante, si potrebbe provare a fare l'importazione e permettendo ai non validi a zero date da inserire, e quindi l'emissione di

UPDATE
    table_name
SET
    date_start = '1970-01-01 00:00:00'
WHERE
    date_start = '0000-00-00 00:00:00'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top