mysql - create - utf8_general_ci vs utf8_spanish_ci
utf8_bin vs. utf_unicode_ci (3)
Mi mesa web
Website_Name//column name
Google
Facebook
Twitter
Orkut
Frype
Skype
Yahoo
Wikipedia
Yo uso utf8_bin colation y luego mi consulta para buscar wikipedia en el sitio web es
Select Website_Name from Website where lower(Website_Name)=''wikipedia''
Y si uso utf8_unicode_ci, entonces mi consulta de selección para buscar wikipedia en el sitio web es
Select Website_Name from Website where Website_Name=''wikipedia''
Ahora quiero saber cuál es la mejor clasificación dependiendo de las siguientes consultas
Depende de lo que necesites.
La intercalación de utf8_bin
compara cadenas basadas únicamente en sus valores de puntos de código Unicode. Si todos los puntos de código tienen los mismos valores, entonces las cadenas son iguales. Sin embargo, esto se rompe cuando tiene cadenas con una composición diferente para combinar marcas (compuestas frente a descompuestas) o caracteres que son canónicamente equivalentes pero que no tienen el mismo valor de punto de código. En algunos casos, el uso de utf8_bin
provocará que las cadenas no coincidan cuando espera que lo utf8_bin
. Teóricamente, utf8_bin
es el más rápido porque no se aplica una normalización de Unicode a las cadenas, pero puede que no sea lo que desea.
utf8_general_ci
aplica la normalización de Unicode mediante el uso de reglas específicas del idioma y compara las cadenas sin distinción de mayúsculas y minúsculas. utf8_general_cs
hace lo mismo, pero compara las cadenas con distinción de mayúsculas y minúsculas.
Estaba usando ''utf8_unicode_ci'', que está predeterminado por la doctrina, tuve que cambiarlo a:
* @ORM/Table(name = "Table", options={"collate"="utf8_bin"})
Dado que algunas de mis claves primarias compuestas consistían en campos de texto. Lamentablemente, ''utf8_unicode_ci'' resolvió "poistný" y "poistny" como el mismo valor de la clave principal y terminó con un bloqueo en la doctrina insertando color. No podía simplemente cambiar la intercalación de una parte de la clave primaria compuesta, tuve que borrar la tabla y recrearla. Espero que le ahorre tiempo a otra persona ..
Personalmente, iría con utf8_unicode_ci
, si espera que el lettercase generalmente no sea importante para los resultados que desea encontrar.
Las colaciones no solo se usan en tiempo de ejecución, sino también cuando MySQL construye índices. Entonces, si cualquiera de estas columnas aparece en un índice, la búsqueda de datos de acuerdo con las reglas de comparación de esa recopilación será casi tan rápida como siempre.
En aquellos casos en los que no desee una coincidencia que no distinga mayúsculas y minúsculas, no aplique la parte superior o inferior. En su lugar, aplique la palabra clave BINARY
delante de la columna utf8 para forzar una comparación de punto de código literal 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 más bajo o más alto, ya que en esos casos, MySQL primero necesita hacer una copia del valor de la columna y modificar su letra, y luego aplicar la comparación. Con BINARY en su lugar, simplemente utilizará el índice primero para encontrar coincidencias, y luego realizará una comparación de punto de código por punto de código hasta que encuentre que los valores no son iguales, lo que generalmente será más rápido.