2016-05-29 13 views
8

Ho una tabella chiamata tabela1512823699024883 che assomiglia a questo: enter image description hereMySQL mostrando strano risultato

Su quale corro query come questa:

SELECT * FROM tabela1512823699024883 WHERE `age` = 'male' 

Questa interrogazione non ha senso, perché age colonna è int tipo e sto cercando il valore string nella mia query, ma MySQL non restituisce ancora righe vuote di sorta. Ecco la query restituita: enter image description here Quindi la riga age non contiene il valore male in nessuna delle due righe restituite. Come può essere possibile?

+3

Immagino che mysql abbia provato a convertire string'male' in int .. quale sarebbe 0 e restituisce con risultato dove 'age = 0' –

+1

Spero che non siano veri dati utente in questi screenshot? – Bergi

risposta

14

Lo stesso problema si verifica con il cast di una stringa su un tipo intero.

SELECT CAST('male' as SIGNED); #0 
#or 
SELECT CAST('male' as UNSIGNED); #0 

Tuttavia, se un numero viene fornito all'interno della stringa.

SELECT CAST('1234male' as UNSIGNED); #1234 
#and 
SELECT CAST('male1234' as UNSIGNED); #0 

per risolvere il problema dell'uso BINARY sulla colonna, che causa anche il valore testuale per diventare maiuscole e minuscole.

SELECT * FROM tabela1512823699024883 WHERE BINARY `age` = 'male'; 
+0

Ottima spiegazione e buoni esempi. – pbalazek

+0

Accettato perché non solo fornisce una buona spiegazione, ma risolve anche il problema di restituire i valori esatti dalla tabella. Ottimo lavoro! – Ognj3n

11

Prova questa semplice query:

SELECT 'male' + 0 

Questo sembra non avere senso. Tuttavia, la query viene eseguita e restituisce il valore 0. Questo a causa della conversione del tipo implicito . Il valore di stringaviene convertito in 0 e quindi aggiunto a 0 e pertanto viene restituito 0.

La stessa cosa accade con la tua richiesta. 'male' convertito in 0 se confrontato con un campo di tipo int.

3

"maschio" è 0! Quindi continuo a ricevere i record in cui l'età è 0. Per capire veramente cosa sta succedendo, basta fare:

select user_name, age, age='male' from tabela1512823699024883; 

il 3 ° colonna sarà 1 per i record che contengono '0' età, e '0' per i record che contengono non -zero età.

2

Il problema qui è che ogni volta che si tenta di confrontare una stringa a intero colonna, il valore sarà gettato al tipo di dati di colonna. Stesso caso accadrà con galleggiante, grande int, int minuscola ecc

cosa mai valore è passato in confronto prima di essere lanciato per quel particolare tipo di dati da parte del motore di MySQL

Ecco il test risultato della query che lancia pochi valori.

select cast('' AS UNSIGNED), cast('anything' AS UNSIGNED), cast(NULL AS UNSIGNED), cast(35.56 AS UNSIGNED), cast(NOW() AS UNSIGNED), cast(1 AS UNSIGNED), cast('Test' AS BINARY), cast('' AS BINARY); 

Result of casting few data types

SELECT * FROM `test_type` WHERE flt = 'test' 

Here flt is float type column.

la flt è di tipo colonna float.

Problemi correlati