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.