2013-05-23 10 views
17

posso usare il TRIM() metodo di MySQL ai campi di pulizia contenenti iniziali o finali spazi bianchi con una UPDATE in questo modo:MySQL selezionare i campi contenenti spazi iniziali o finali

UPDATE Foo SET field = TRIM(field); 

vorrei vedere effettivamente i campi questo avrà un impatto prima che questo venga eseguito. Ho provato questo, ma restituisce 0 risultati:

SELECT * FROM Foo WHERE field != TRIM(field); 

Sembra che questo dovrebbe funzionare ma non è così.

Chiunque ha una soluzione? Inoltre, curioso di sapere perchè questo non funziona ...

+0

Vai a questa risposta: http://stackoverflow.com/a/2363449/1618257 Inoltre, per '=', provare '<>' –

+0

@ David! : '! =' vs '<>' non sembra fare la differenza. –

+0

eggyal ha spiegato degli spazi finali. Dati i risultati della tua query, è lecito ritenere che nessuno dei tuoi valori avesse spazi iniziali. –

risposta

32

Come documentato in The CHAR and VARCHAR Types:

Tutte le regole di confronto di MySQL sono di tipo PADSPACE. Ciò significa che tutti i valori e VARCHAR in MySQL vengono confrontati indipendentemente dagli spazi finali.

Nella definizione di operatore LIKE, il manuale indica:

In particolare, spazi finali sono significativi, che non è vero per CHAR o VARCHAR confronti eseguiti con l'operatore =:

Come indicato in this answer:

Questo comportamento è specificato in SQL-92 e SQL: 2008. Ai fini del confronto, la stringa più breve viene riempita alla lunghezza della stringa più lunga.

dal progetto (8.2 < comparatore predicato >):

Se la lunghezza in caratteri di X non è uguale alla lunghezza in caratteri di Y, allora la stringa più corta viene effettivamente sostituito, ai fini di confronto, con una copia di se stesso che è stata estesa alla lunghezza della stringa più lunga mediante concatenazione a destra di uno o più caratteri pad, in cui il carattere pad viene scelto in base a CS. Se CS ha la caratteristica NO PAD, allora il carattere pad è un personaggio dipendente dall'implementazione diverso da qualsiasi carattere nel set di caratteri di X e Y che raccoglie meno di qualsiasi stringa in CS. In caso contrario, il carattere del riquadro è uno spazio < >.

Una soluzione:

SELECT * FROM Foo WHERE CHAR_LENGTH(field) != CHAR_LENGTH(TRIM(field)) 
+0

@peterm: Suppongo sia concepibile che, in alcuni set di caratteri, la codifica di una stringa tagliata abbia lo stesso numero di byte della stringa non tagliata. – eggyal

24
SELECT * 
FROM 
    `foo` 
WHERE 
    (name LIKE ' %') 
OR 
    (name LIKE '% ') 
+0

CORRETTO! Secondo questa idiosincrasia ben documentata in MySQL, 'LIKE' rispetta gli spazi bianchi iniziali e finali, dove' = 'non è: https://bugs.mysql.com/bug.php?id = 64772 –

Problemi correlati