2012-07-12 11 views
5

Ho un risultato interessante e non capisco perché.MySQL Query - la clausola `where (varchar)` restituisce gli articoli che iniziano solo con un numero. Perché?

SELECT * 
    FROM items im 
WHERE ItemNumber 

ItemNumber è un varchar(50).

I risultati di questa query restituiscono tutti gli articoli che lo ItemNumber inizia con un numero. Se lo ItemNumber inizia con una lettera, è escluso.

Qualcuno ha una spiegazione del perché la query interagisce in questo modo?

+0

suppongo che voi siate consapevoli del fatto che la clausola in cui non è chiaro - sembra non necessario o incompleto. (Il motivo per cui funziona come descritto di seguito) –

risposta

1

MYSQL restituirà tutte le righe con il Numero oggetto che inizia con un numero che è greater than equal to 0.5 and less than equal to -0.5. Considera tutto il numero greater >= +/-0.5 as true. E la clausola where funziona solo in base a true o false.

true >= -0.5 > false < 0.5 <= true 

Molto intelligentemente, mysql considerare tutti >= +/-0.5 numero come 1 (vero). È necessario true per valori arrotondati diversi da zero.

se si scrive

SELECT * FROM items im WHERE 1; // will return all rows. 
SELECT * FROM items im WHERE 0.5; // will return all rows. 
SELECT * FROM items im WHERE 0.4; // will return nothing. 
SELECT * FROM items im WHERE 1 and 0.2; // will return nothing. 
SELECT * FROM items im WHERE 0.3 or 0.5; // will return all rows. 
0

La tua clausola WHERE è in attesa di un BOOLEAN, non so ora come mysql gestisca varchar numerico, ma penso che mysql possa assumere che la stringa iniziale numerica sia equivalente a true. Si può interpretare la query come

SELECT * 
    FROM items im 
    WHERE ItemNumber IS TRUE 
-1

Forse si dovrebbe confrontare ItemNumber con qualcosa. Oppure provate

WHERE ItemNumber NOT NULL 

o qualcosa di simile

WHERE ItemNumber != '' 
6

Questa è la strategia di MySQL di essere intelligente e assumendo che sa quello che vuoi dire (al contrario di fare ciò che si scrive).

Qualsiasi espressione che valuti a non zero viene considerata vera. Quegli elementi che iniziano con una lettera non possono (implicitamente) essere convertiti in un numero, quindi è considerato zero e quindi "falso". Penso che anche gli articoli con il valore (carattere) '0' siano esclusi.

La seguente dichiarazione per esempio sarà lieto di eliminare tutte le righe della tabella:

DELETE FROM foobar 
WHERE 42; 

Non è possibile disattivare questo comportamento. Nemmeno in modalità ANSI MySQL lancia un'espressione di sintassi.

+0

Questo è anche diverso da zero 'SELECT * FROM' test' t dove 0.4; 'ma non è considerato vero. – manurajhada

0

MySQL supporta questa cosa booleano che dovrebbe essere eliminato. Porta a confusione e restituirà risultati errati/non previsti. Nessun altro RDBMS supporta questo.Supponiamo di avere una procedura con un parametro e si dimentica di specificarlo come qui di seguito

WHERE col 

tornerà tutti i dati ed è molto difficile da eseguire il debug

Problemi correlati