Това поведение е по проект, не само в MySQL.
Можете да го заобиколите в сравнения с помощта на 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)
но не много повече. Това ще ви помогне с SELECT
s ако се появят празни места, напр. при въвеждане на потребител за търсене; но ако искате действително да въведете информация, свързана с празни интервали, това ще бъде проблем (не можете да имате индекс както с 'a', така и с 'a').
Вижте също
Завършващи празни интервали във varchar се нуждаят да се разглеждат в сравнение
Вероятно бихте могли да обърнете низовете в тази колона и ги обърнете обратно, когато ги показвате. Разбира се, това ще разруши всяка подредба въз основа на тази колона, но ако тествате само равенство или съществуване на подниз, това просто може да работи. Водеща интервалите се броят.
За търсене на равенство можете също да съхранявате base64 кодирането на низа, което трябва да поддържа лексикографския ред (т.е. редът между a и b трябва да се поддържа между base64(a) и base64(b)). Или може да добавите терминатор към низа („\n“ може да се справи добре и да не се показва при търсения).
И накрая, но е рисковано, тъй като хората не могат да направят разликата, можете да замените интервалите с 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)
Редовете изглеждат да са равни, но не са. Имайте предвид, че в HTML пространството е интервал, а 49824 е
(непрекъсваемо пространство). Това засяга функции, които преобразуват към и от HTML, а това, че nbsp всъщност е UTF8 кодова точка, означава, че честен низът е два байта, но дължината е измамена низът всъщност е три .
Накрая можете да декларирате колоната VARBINARY
вместо VARCHAR
, като по този начин напълно скрие случващото се. Изглежда като най-лесното решение, но се опасявам, че може да ви ухапе след няколко седмици или месеци.