Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL 5.5 губи крайни интервали в заявката

Това поведение е по проект, не само в 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 , като по този начин напълно скрие случващото се. Изглежда като най-лесното решение, но се опасявам, че може да ви ухапе след няколко седмици или месеци.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Следвайте дизайна на таблицата с потребителска база данни

  2. Отдалечен достъп до Mysql

  3. Възможно ли е да се създаде колона с UNIX_TIMESTAMP по подразбиране в MySQL?

  4. Просто въведение в използването на MySQL на терминала на Linux

  5. Атомни ли са тригерите, базирани на заявки?