Personalmente, me gustaría ir con utf8_unicode_ci
, si espera que la letra no sea generalmente importante para los resultados que desea encontrar.
Las intercalaciones no solo se utilizan en tiempo de ejecución, sino también cuando MySQL crea índices. Por lo tanto, si cualquiera de estas columnas aparece en un índice, la búsqueda de datos de acuerdo con las reglas de comparación de esa intercalación será más rápida que nunca.
En aquellos casos en los que no desea la coincidencia de mayúsculas y minúsculas, entonces no aplique arriba o abajo. En su lugar, aplique la palabra clave BINARY
al frente de la columna utf8 para forzar una comparación literal del punto de código en lugar de una de acuerdo con la intercalación.
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)
Esto debería ser mucho más rápido que usar inferior o superior, ya que en esos casos, MySQL necesita primero hacer una copia del valor de la columna y modificar su mayúsculas y minúsculas, y luego aplicar la comparación. Con BINARY en su lugar, simplemente usará el índice primero para encontrar coincidencias, y luego hará un punto de código por comparación de punto de código hasta que encuentre que los valores no son iguales, lo que generalmente será más rápido.
Entonces, ¿qué debo usar .Es específico –
Como dije, debe tomar esta decisión en función de lo que necesita. Por lo que puedo ver sobre lo que estás tratando de hacer, iría con 'utf8_general_ci', yo mismo. –
¿Existe alguna desventaja en el uso de lower() con utf8_bin –