Sono stato molto sorpreso quando MySQL mi ha permesso di inserire un NULL
in un campo che è stato creato con NOT NULL
. Ho fatto alcune ricerche e ho scoperto come abilitare la modalità rigorosa. Tuttavia, io non sono abbastanza sicuro che cosa convalida MySQL fa quando STRICT_ALL_TABLES
è abilitato.Che convalida fa MySQL fare quando modalità rigorosa è abilitata?
Il manuale dice:
modalità Strict controlla come MySQL gestisce i valori di ingresso non validi o mancanti. Un valore può essere valido per diversi motivi. (sottolineatura mia) Ad esempio, si potrebbe avere il tipo di dati sbagliato per la colonna, o potrebbe essere fuori portata.
Capisco quello che considera mancante e come lo gestisce. Sono poco chiaro quello che considera non valida . Ho fatto alcuni test e scoperto i seguenti:
- stringhe troppo lunghe non sono validi
- i numeri che sono fuori portata sono validi
NULL
s per unNULL
colonna non sono validiTRUE
eFALSE
sembrano essere sempre valido (che diventano 1 e 0, rispettivamente) non sono validi sono validi- a zero date
- date non valide (Addit modalità ionale possono essere abilitati per modificare questo comportamento)
- galleggia in un campo intero sono validi (ottengono arrotondata)
- lettere in un campo numerico non sono validi
Ha MySQL fare altri controlli di convalida diverse cosa è menzionato sopra?
Il manuale indica "tipo di dati errato per la colonna", ma l'unica situazione che vedo dove questo entra effettivamente in gioco è le lettere in un campo numerico. Ci sono altri esempi di errori nel tipo di dati?
Esiste una lista di ciò che esegue esattamente MySQL?
MODIFICA: Per la cronaca, la mia applicazione ha già un'ampia convalida. Sto usando la modalità rigorosa come controllo dell'ultima possibilità, in caso di necessità. Se mi dimentico di controllare qualcosa, lo voglio a fail fast anziché "silenziare silenziosamente i miei dati".
Ho la sensazione che si vogliono che il DB faccia la convalida dei dati per te. Se è così, è un brutto percorso da percorrere. – siride
@siride: il DBMS *** è lì per fare la convalida (chiavi esterne, chiavi primarie, vincoli di controllo, tipo di convalida). Il fatto che MySQL ti permetta di memorizzare "31 febbraio" è un bug secondo me. O per dirla in altro modo: è un pessimo percorso da percorrere se il DBMS non esegue alcuna convalida. –
Ho già effettuato la convalida nell'applicazione. Non sto * usando * la modalità rigorosa come * sostituzione * per una buona programmazione, ma piuttosto come un modo per assicurarmi una buona programmazione. – toxalot