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

Al contestar esta pregunta , me volví inseguro sobre algo a lo que no logré encontrar una respuesta suficiente.

¿Cuáles son las diferencias prácticas entre utilizar las utf8_bin binarias y las intercalaciones 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 se comparan los valores de byte (¿verdad?)

  2. Solo búsquedas sensibles a mayúsculas y minúsculas en _bin

  3. No A = Ä igualdad en _bin

¿Hay alguna otra diferencia o efecto secundario a tener en cuenta?

Referencia:

  • 9.1.2. Conjuntos de caracteres y colaciones en MySQL
  • 9.1.7.6. Las colaciones _bin y binarias en el manual mySQL
  • 9.1.7.7. El operador BINARIO

Preguntas similares que no abordan el problema:

  • UTF-8: ¿General? ¿Compartimiento? Unicode?

La intercalación binaria compara su cadena exactamente como lo haría strcmp () en C, si los caracteres son diferentes (ya sea una diferencia de caso o diacrítica). La desventaja es que el orden de clasificación no es natural.

Un ejemplo de orden de clasificación no natural (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 están ordenadas uno al lado del otro)

La ventaja práctica de la intercalación binaria es su velocidad, ya que la comparación de cadenas es muy simple / rápida. En general, los índices con binario pueden no producir los resultados esperados para el género, sin embargo, para las coincidencias exactas pueden ser útiles.

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

utf8_general_ci : Compara cadenas usando reglas de lenguaje general y usando comparaciones insensibles a mayúsculas y minúsculas.

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

Por ejemplo, lo siguiente se evaluará como verdadero con cualquiera de las intercalaciones UTF8_general , pero no con la intercalación utf8_bin :

Ä = A Ö = O Ü = U

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

Las otras respuestas explican bien las diferencias.

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

  • la columna contiene datos hexadecimales como contraseñas de contraseña
  • usted solo está interesado en las coincidencias exactas, no clasificando
  • para identificadores con solo [a-z0-9_] caracteres, incluso puede usarlo para ordenar
  • por alguna razón, almacena números en CHAR () o columnas VARCHAR (como teléfonos)
  • códigos ZIP
  • UUIDs
  • etc

En todos esos casos, puede guardar un (poco) bit de ciclos de CPU con una intercalación binaria.

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

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