2009-12-08 5 views
11

Sto cercando di creare un semplice 'sì'/'forse'/'no' Enum in MySQL con PhpMyAdmin Ho impostato NULL su No e 'forse' come valore predefinitoMySQL Enum contiene sempre '' (stringa vuota) nelle possibilità

Mi aspetto un errore durante l'esecuzione di qualcosa come "SET EnumCol = ''", perché '' (una stringa vuota) non dovrebbe essere un valore valido. Ma la query viene eseguita e il valore viene impostato su "", il che significa che sono obbligato a ricontrollare questo valore indesiderato e illegale ogni volta che leggo dal database!

Si tratta di un bug in MySQL o PhpMyAdmin? Qualcuno sa come disabilitare questo comportamento?

Grazie.

risposta

19

La stringa vuota è un indicatore di errore di valori non validi in ENUM. Da mysql ENUM type manual:

Se si inserisce un valore non valido in un ENUM (vale a dire, una stringa non presente nella lista di valori consentiti), la stringa vuota si inserisce invece come un valore di errore speciale. Questa stringa può essere distinta da una stringa vuota "normale" dal fatto che questa stringa ha il valore numerico 0. Di questo più avanti.

per disattivare questo comportamento:

Se la modalità SQL rigorosa è abilitata, i tentativi di inserire i valori ENUM non validi provocano un errore.

Per attivare la modalità rigorosa, vedere Server SQL Modes.

-2

ENUM sono un rompiscatole. a meno che non sia necessario impostare il valore con un numero, starei lontano da loro.

Utilizzare invece una colonna varchar con una chiave esterna per una tabella di ricerca per limitare i valori. ciò renderà impossibile inserire un valore errato.

+0

Ma le manipolazioni di tipo "ENUM" saranno più veloci del controllo di chiavi esterne. –

+3

vero. ma a chi importa? questa probabilmente non è un'applicazione che ha 10k inserti al minuto, dove il passaggio a enum migliorerà le prestazioni. scegliere enum su chiavi esterne per la velocità è un caso di ottimizzazione prematura. – longneck

+0

Apprezzo questa soluzione alternativa all'utilizzo di una tabella di ricerca con FK. Sembra più estendibile pure. –