¿Qué efectos tiene el uso de una colación binaria?


Mientras respondía esta pregunta, me sentí inseguro acerca de algo para lo que no logré encontrar una respuesta suficiente.

¿Cuáles son las diferencias prácticas entre usar las intercalaciones binarias utf8_bin y las intercalaciones que no distinguen entre mayúsculas y minúsculas utf8_general_ci?

Puedo ver tres:

  1. Ambos tienen un orden de clasificación diferente; es probable que el orden de clasificación de _bin ponga cualquier diéresis al final del alfabeto, porque los valores de bytes se comparan (¿correcto?)

  2. Only búsquedas sensibles a mayúsculas en _bin

  3. No A = Ä igualdad en _bin

Hay otras diferencias o efectos secundarios a tener en cuenta?

Referencia:

Preguntas similares que no abordan la cuestión:

Author: Community, 2011-04-03

4 answers

La intercalación binaria compara su cadena exactamente como lo haría strcmp() en C, si los caracteres son diferentes (ya sea solo la diferencia de mayúsculas y minúsculas o diacríticos). La desventaja de que el orden de clasificación no es natural.

Un ejemplo de orden de clasificación antinatural (como en "binario" es) : A,B, a, b El orden de clasificación natural sería en este caso, por ejemplo: A,a, B, b (las variaciones pequeñas y de capital de la letra sme se ordenan una al lado de la otra)

La ventaja práctica de la intercalación binaria es su velocidad, como cadena la comparación es muy simple / rápida. En general, los índices con binario pueden no producir resultados esperados para ordenar, sin embargo, para coincidencias exactas pueden ser útiles.

 46
Author: Vladislav Vaintroub,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-04 01:30:45

utf8_bin: Compara cadenas por el valor binario de cada carácter en la cadena.

utf8_general_ci: Compara cadenas usando reglas generales de lenguaje y usando comparaciones que no distinguen entre mayúsculas y minúsculas.

utf8_general_cs: Compara cadenas usando reglas generales de lenguaje y usando comparaciones que distinguen entre mayúsculas y minúsculas.

Por ejemplo, lo siguiente se evaluará en true con cualquiera de las colaciones UTF8_general, pero no con el utf8_bin cotejo:

Ä = A Ö = O Ü = U

Con la colación utf8_general_ci, también devolverían true incluso si no es el mismo caso. http://www.phpbuilder.com/board/showpost.php?s=2e642ac7dc5fceca2dbca1e2b9c424fd&p=10820221&postcount=2

 12
Author: HaloWebMaster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-08 04:30:59

Las otras respuestas explican bien las diferencias.

La intercalación binaria puede ser útil en algunos casos :

  • la columna contiene datos hexadecimales como hashes de contraseña
  • solo le interesan las coincidencias exactas, no la clasificación
  • para identificadores con solo caracteres [a-z0-9_], incluso puede usarlo para ordenar
  • por alguna razón almacenamos números en columnas CHAR() o VARCHAR (como teléfonos)
  • códigos postales
  • UUIDs
  • etc

En en todos esos casos puede guardar un (pequeño) bit de ciclos de cpu con una intercalación binaria.

 1
Author: peufeu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-07 13:36:00

Con utf8_general_ci, las coincidencias se producen sin tener en cuenta el caso y la acentuación. Puede ser algo bueno cuando necesita realizar consultas sobre palabras.

En utf8_bin, la coincidencia solo ocurre cuando las cadenas son estrictamente las mismas. Las consultas son más rápidas de esta manera.

 0
Author: Mathieu Rodic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-04 22:05:47