Osobiście chciałbym wybrać z utf8_unicode_ci
, jeśli spodziewasz się, że litera nie jest ogólnie ważna dla wyników, które chcesz znaleźć.
Zbiory są używane nie tylko w środowisku wykonawczym, ale także wtedy, gdy MySQL tworzy indeksy. Jeśli więc którakolwiek z tych kolumn pojawi się w indeksie, znalezienie danych zgodnie z regułami porównania tego sortowania będzie prawie tak szybkie, jak to tylko możliwe.
W przypadkach, gdy nie chcesz dopasowywania wielkości liter, nie stosuj górnej ani dolnej. Zamiast tego zastosuj słowo kluczowe BINARY
przed kolumną utf8, aby wymusić dosłowne porównanie kodu, a nie jedno zgodnie z sortowaniem.
mysql> create table utf8 (name varchar(24) charset utf8 collate utf8_general_ci, primary key (name));
Query OK, 0 rows affected (0.14 sec)
mysql> insert into utf8 values ('Roland');
Query OK, 1 row affected (0.00 sec)
mysql> insert into utf8 values ('roland');
ERROR 1062 (23000): Duplicate entry 'roland' for key 'PRIMARY'
mysql> select * from utf8 where name = 'roland';
+--------+
| name |
+--------+
| Roland |
+--------+
1 row in set (0.00 sec)
mysql> select * from utf8 where binary name = 'roland';
Empty set (0.01 sec)
ten powinien być znacznie szybszy niż przy użyciu dolne lub górne, ponieważ w tych przypadkach, MySQL musi najpierw zrobić kopię wartości kolumny i zmodyfikować jego lettercase, a następnie zastosować porównanie. Gdy BINARY będzie na miejscu, użyje najpierw indeksu do znalezienia dopasowań, a następnie porówna kod, dopóki nie stwierdzi, że wartości nie są równe, co generalnie będzie szybsze.
więc co mam użyć .be specyficzne –
Jak już powiedziałem, powinieneś podjąć decyzję w oparciu o to, czego potrzebujesz. Z tego, co widzę, co próbujesz zrobić, sam bym podszedł do 'utf8_general_ci'. –
Czy jest jakaś niedogodność w korzystaniu z funkcji lower() z utf8_bin –