Лично я бы выбрал utf8_unicode_ci
, если вы ожидаете, что регистр букв обычно не важен для результатов, которые вы хотите найти.
Сопоставления используются не только во время выполнения, но и при построении индексов MySQL. Таким образом, если какой-либо из этих столбцов появится в индексе, поиск данных в соответствии с правилами сравнения этого сопоставления будет максимально быстрым.
В тех случаях, когда вы не хотите совпадения без учета регистра, не применяйте верхний или нижний. Вместо этого примените ключевое слово BINARY
перед столбцом utf8, чтобы принудительно выполнить буквальное сравнение кодовых точек, а не в соответствии с сопоставлением.
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)
Это должно быть намного быстрее, чем использование нижнего или верхнего, поскольку в этих случаях MySQL сначала должен сделать копию значения столбца и изменить его регистр букв, а затем применить сравнение. При наличии BINARY он просто сначала использует индекс для поиска совпадений, а затем выполняет сравнение кодовых точек, пока не обнаружит, что значения не равны, что, как правило, будет быстрее.
person
Roland Bouman
schedule
07.06.2012