Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL 5.5 verliert nachgestellte Leerzeichen in der Abfrage

Dieses Verhalten ist beabsichtigt, nicht nur in MySQL.

Sie können es in Vergleichen umgehen durch Verwendung von 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)

aber nicht viel mehr. Das hilft Ihnen bei SELECT s Wenn Leerzeichen erscheinen, z. in der Benutzereingabe zu einer Suche; aber wenn Sie tatsächlich mit Leerzeichen versehene Informationen eingeben möchten, wird dies ein Problem sein (Sie können keinen Index mit sowohl 'a' als auch 'a ' haben).

Siehe auch

Trailing-Whitespace in varchar braucht im Vergleich zu betrachten

Sie könnten möglicherweise umkehren die Zeichenfolgen in dieser Spalte, und kehren Sie sie um, wenn Sie sie anzeigen. Natürlich wird dies jede Sortierung basierend auf dieser Spalte zerstören, aber wenn Sie nur die Gleichheit oder das Vorhandensein von Teilzeichenfolgen testen, könnte es funktionieren. Führend Leerzeichen zählen.

Für Gleichheitssuchen können Sie auch die base64-Codierung der Zeichenfolge speichern, die die lexikografische Reihenfolge beibehalten sollte (dh die Reihenfolge zwischen a und b sollte zwischen base64 (a) und base64 (b) beibehalten werden). Oder Sie können ein Abschlusszeichen an die Zeichenfolge anhängen ("\n" könnte gut sein und nicht in Suchen erscheinen).

Schließlich, aber es ist riskant, weil Menschen den Unterschied nicht erkennen können, könnten Sie Leerzeichen durch das UTF8-Zeichen (49824) ersetzen:

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)

Die Zeilen scheinen gleich sein, sind es aber nicht. Beachten Sie, dass das Leerzeichen in HTML ein Leerzeichen ist und 49824   ist (geschütztes Leerzeichen). Dies betrifft Funktionen, die in und aus HTML konvertieren, und dass nbsp eigentlich ein UTF8-Codepunkt ist, bedeutet, dass ehrlich String ist zwei Bytes, aber Länge von ausgetrickst string ist eigentlich drei .

Schließlich können Sie die Spalte VARBINARY deklarieren statt VARCHAR , wodurch vollständig verborgen wird, was passiert. Es sieht nach der einfachsten Lösung aus, aber ich fürchte, es könnte Sie einige Wochen oder Monate später beißen.