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

MySQL 5.5 mister efterfølgende mellemrum i forespørgsel

Denne adfærd er ved design, ikke kun i MySQL.

Du kan omgå det i sammenligninger ved at bruge 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)

men ikke meget mere. Dette vil hjælpe dig med SELECT s hvis der vises mellemrum f.eks. i brugerinput til en søgning; men hvis du rent faktisk vil indtaste hvide mellemrums-sporet information, vil det være et problem (du kan ikke have et indeks med både 'a' og 'a ').

Se også

Trailing whitespace i varchar-behov skal betragtes i sammenligning

Du kunne tænkes omvendt strengene i den kolonne, og vend dem tilbage, når de vises. Selvfølgelig vil dette ødelægge enhver bestilling baseret på den kolonne, men hvis du kun tester lighed eller eksistens af substreng, kan det bare fungere. Ledende mellemrum tæller.

Til lighedssøgninger kan du muligvis også gemme strengens base64-kodning, som burde bevare den leksikografiske rækkefølge (dvs. rækkefølgen mellem a og b bør opretholdes mellem base64(a) og base64(b)). Eller du kan tilføje en terminator på strengen ("\n" kunne klare sig godt og ikke vises i søgninger).

Endelig, men det er risikabelt, fordi mennesker ikke kan kende forskel, kan du erstatte mellemrum med 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)

Rækkerne synes at være lige, men det er de ikke. Bemærk, at i HTML er mellemrummet et mellemrum, og 49824 er   (non-breaking space). Dette påvirker funktioner, der konverterer til og tilbage HTML, og at nbsp faktisk er et UTF8-kodepunkt betyder, at ærlig streng er to bytes, men længden på tricked streng er faktisk tre .

Endelig kan du erklære kolonnen VARBINARY i stedet for VARCHAR , og dermed helt skjuler, hvad der sker. Det ligner den nemmeste løsning, men jeg frygter, at det kan bide dig nogle uger eller måneder senere.



  1. Laravel:SQLSTATE[HY000] [2054] Serveren anmodede om godkendelsesmetode ukendt for klienten

  2. Importer Excel-regnearkskolonner til SQL Server-databasen

  3. mysql - søg mellem datoer, hvor alle datoer vises

  4. Forebyg SQL-injektionsangreb i et Java-program