sql >> Databáze >  >> RDS >> Mysql

Jak řetězcové porovnávání pro jeden prostor

A BINARY srovnání z těchto dvou řetězců je vyžadována pro přesnou shodu

Za normálních okolností se při porovnávání neberou v úvahu mezery na konci, ale BINARY operátor vynutí, aby to bylo:

mysql> SELECT BINARY '   ' = ' ';
+--------------------+
| BINARY '   ' = ' ' |
+--------------------+
|                  0 |
+--------------------+

Problémem s mezerami na konci nejsou mimochodem ovlivněna pouze srovnání obsahující pouze bílé znaky:

mysql> SELECT 'abc   ' = 'abc';
+------------------+
| 'abc   ' = 'abc' |
+------------------+
|                1 |
+------------------+

...ale...

mysql> SELECT BINARY 'abc   ' = 'abc';
+-------------------------+
| BINARY 'abc   ' = 'abc' |
+-------------------------+
|                       0 |
+-------------------------+

...a ještě více matoucí je, že vedoucí mezery je významné:

mysql> SELECT ' abc   ' = 'abc';
+-------------------+
| ' abc   ' = 'abc' |
+-------------------+
|                 0 |
+-------------------+

Ohledně indexování:

BINARY zabrání použití indexu ve sloupci znaků. Nicméně poznámka k dokumentům naznačuje, že index bude použít, pokud je BINARY operátor se použije na stranu řetězcového doslovu srovnání jako v:

SELECT * FROM `tbl` WHERE `col` = BINARY 'string   '


  1. Migrace dat

  2. Fulltextové vyhledávání s InnoDB

  3. Operand by měl obsahovat 1 sloupec – MySQL NENÍ IN

  4. Je ovladač MariaDB JDBC ovlivněn zranitelností Log4j?