Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL 5.5 perde spazi finali nella query

Questo comportamento è di progettazione, non solo in MySQL.

Puoi aggirarlo nei confronti utilizzando BINARY :

mysql> select version(), 'a' = 'a ', BINARY 'a' = BINARY 'a ';
+-------------+------------+--------------------------+
| version()   | 'a' = 'a ' | BINARY 'a' = BINARY 'a ' |
+-------------+------------+--------------------------+
| 5.5.25a-log |          1 |                        0 |
+-------------+------------+--------------------------+
1 row in set (0.00 sec)

ma non molto di più. Questo ti aiuterà con SELECT s se compaiono spazi bianchi, ad es. nell'input dell'utente per una ricerca; ma se vuoi effettivamente inserire informazioni tracciate da spazi bianchi, sarà un problema (non puoi avere un indice con 'a' e 'a').

Vedi anche

Lo spazio bianco finale in varchar ha bisogno da considerare a confronto

Si potrebbe plausibilmente reverse le stringhe in quella colonna e invertirle quando le visualizzi. Ovviamente questo rovinerà qualsiasi ordinamento basato su quella colonna, ma se si verifica solo l'uguaglianza o l'esistenza di sottostringhe, potrebbe funzionare. Leader gli spazi contano.

Per le ricerche di uguaglianza potresti anche memorizzare la codifica base64 della stringa, che dovrebbe mantenere l'ordine lessicografico (cioè, l'ordine tra aeb dovrebbe essere mantenuto tra base64(a) e base64(b)). Oppure potresti aggiungere un terminatore alla stringa ("\n" potrebbe andare bene e non apparire nelle ricerche).

Infine, ma è rischioso perché gli esseri umani non possono dire la differenza, potresti sostituire gli spazi con UTF8 char(49824):

mysql> select concat ('\'a', char(49824),'\'') AS tricked,
              concat ('\'a', ' '        ,'\'') as honest,
              concat ('\'a', char(49824),'\'') =
              concat ('\'a', ' '        ,'\'') as equals;

+---------+--------+--------+
| tricked | honest | equals |
+---------+--------+--------+
| 'a '    | 'a '   |      0 |
+---------+--------+--------+
1 row in set (0.00 sec)

Le righe sembrano essere uguali, ma non lo sono. Nota che in HTML lo spazio è uno spazio e 49824 è   (spazio unificatore). Ciò influisce sulle funzioni che convertono avanti e indietro HTML e il fatto che nbsp sia effettivamente un punto di codice UTF8 significa che onesto la stringa è di due byte, ma la lunghezza di ingannato string è in realtà tre .

Infine puoi dichiarare la colonna VARBINARY invece di VARCHAR , nascondendo così completamente ciò che sta accadendo. Sembra la soluzione più semplice, ma temo che potrebbe morderti alcune settimane o mesi dopo.