sql >> Database >  >> RDS >> Mysql

MySQL 5.5 verliest volgspaties in query

Dit gedrag is inherent aan het ontwerp, niet alleen in MySQL.

Je kunt er omheen werken in vergelijkingen door BINARY . te gebruiken :

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)

maar niet veel meer. Dit zal je helpen met SELECT s als er spaties verschijnen, b.v. in gebruikersinvoer naar een zoekopdracht; maar als u informatie met witruimte-trail wilt invoeren, is dat een probleem (u kunt geen index hebben met zowel 'a' als 'a').

Zie ook

Trailing-whitespace in varchar-behoeften om in vergelijking te worden beschouwd

U kunt mogelijk omkeren de tekenreeksen in die kolom, en keer ze terug wanneer ze worden weergegeven. Natuurlijk zal dit elke volgorde op basis van die kolom vernietigen, maar als je alleen gelijkheid of het bestaan ​​​​van substrings test, zou het gewoon kunnen werken. Toonaangevend spaties tellen wel mee.

Voor zoekopdrachten naar gelijkheid kunt u ook de base64-codering van de tekenreeks opslaan, die de lexicografische volgorde zou moeten behouden (d.w.z. de volgorde tussen a en b moet worden gehandhaafd tussen base64(a) en base64(b)). Of je kunt een terminator aan de string toevoegen ("\n" zou het goed kunnen doen en niet verschijnen in zoekopdrachten).

Ten slotte, maar het is riskant omdat mensen het verschil niet kunnen zien, kun je spaties vervangen door de UTF8-teken (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)

De rijen lijken gelijk zijn, maar dat zijn ze niet. Merk op dat in HTML de spatie een spatie is, en 49824 is   (vaste ruimte). Dit heeft invloed op functies die HTML van en naar HTML converteren, en het feit dat nbsp eigenlijk een UTF8-codepunt is, betekent dat eerlijk string is twee bytes, maar de lengte van bedrogen string is eigenlijk drie .

Eindelijk kunt u de kolom VARBINARY . declareren in plaats van VARCHAR , en verbergt dus volledig wat er gebeurt. Het lijkt de gemakkelijkste oplossing, maar ik vrees dat het je over een paar weken of maanden kan bijten.



  1. laravel errno 150 externe sleutelbeperking is onjuist gevormd

  2. De tekst-, ntext- en afbeeldingsgegevens> typen kunnen niet worden vergeleken of gesorteerd, behalve bij gebruik van IS NULL of LIKE> operator

  3. JSON retourneren vanuit MySQL met kolomnaam

  4. hoe gebruik je sql join in mysql