Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL 5.5 traci końcowe spacje w zapytaniu

To zachowanie jest zgodne z projektem, nie tylko w MySQL.

Możesz to obejść w porównaniach za pomocą 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)

ale niewiele więcej. Pomoże ci to z SELECT s jeśli pojawiają się spacje, np. w danych wejściowych użytkownika do wyszukiwania; ale jeśli chcesz faktycznie wprowadzić informacje ze spacją, będzie to problem (nie możesz mieć indeksu z 'a' i 'a').

Zobacz także

Końcowe białe znaki w potrzebach varchar do rozważenia w porównaniu

Możliwe, że możesz odwrócić ciągi w tej kolumnie i odwracaj je z powrotem podczas ich wyświetlania. Oczywiście zrujnuje to wszelkie porządkowanie oparte na tej kolumnie, ale jeśli testujesz tylko równość lub istnienie podciągu, może to po prostu zadziałać. Wiodący spacje się liczą.

W przypadku wyszukiwania równości można również przechowywać kodowanie base64 ciągu, które powinno zachować porządek leksykograficzny (tj. kolejność między aib powinna być zachowana między base64(a) i base64(b)). Możesz też dołączyć terminator do ciągu ("\n" może dobrze działać i nie pojawiać się w wyszukiwaniach).

Wreszcie, ale jest to ryzykowne, ponieważ ludzie nie mogą odróżnić, możesz zastąpić spacje znakiem UTF8 (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)

Wiersze wydaje się być równymi, ale nie są. Zwróć uwagę, że w HTML spacja jest spacją, a 49824 to   (spacja niełamliwa). Ma to wpływ na funkcje, które konwertują do i z HTML, a nbsp jest faktycznie punktem kodowym UTF8, co oznacza, że ​​uczciwy ciąg to dwa bajty, ale długość oszukana ciąg to w rzeczywistości trzy .

Na koniec możesz zadeklarować kolumnę VARBINARY zamiast VARCHAR , całkowicie ukrywając to, co się dzieje. Wygląda na najłatwiejsze rozwiązanie, ale obawiam się, że może Cię to ugryźć za kilka tygodni lub miesięcy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę usunąć te (?²) typy znaków za pomocą PHP?

  2. Podział relacyjny w mysql bez funkcji agregujących?

  3. Nie można pobrać identyfikatora wiersza za pomocą pdo

  4. Jak zamienić wyrażenie regularne w MySQL?

  5. PHP, MySQL - czy potrafisz odróżnić wiersze dopasowane od wierszy, których dotyczy problem?