¿Qué significa el conjunto de caracteres y la intercalación exactamente?

Puedo leer la documentación de MySQL y está bastante claro. Pero, ¿cómo se decide qué juego de caracteres usar? ¿En qué datos tiene efecto la intercalación?

Estoy pidiendo una explicación de los dos y cómo elegirlos.

De los documentos de MySQL:

Un conjunto de caracteres es un conjunto de símbolos y codificaciones. Una intercalación es un conjunto de reglas para comparar personajes en un juego de caracteres. Hagamos la distinción clara con un ejemplo de un conjunto de caracteres imaginarios.

Supongamos que tenemos un alfabeto con cuatro letras: ‘A’, ‘B’, ‘a’, ‘b’. Le damos a cada letra un número: ‘A’ = 0, ‘B’ = 1, ‘a’ = 2, ‘b’ = 3. La letra ‘A’ es un símbolo, el número 0 es la encoding de ‘A’ , y la combinación de las cuatro letras y sus codificaciones es un juego de caracteres.

Ahora, supongamos que queremos comparar dos valores de cadena, ‘A’ y ‘B’. La forma más sencilla de hacerlo es mirar las codificaciones: 0 para ‘A’ y 1 para ‘B’. Como 0 es menor que 1, decimos que ‘A’ es menor que ‘B’. Ahora, lo que acabamos de hacer es aplicar una intercalación a nuestro conjunto de caracteres. La intercalación es un conjunto de reglas (solo una regla en este caso): “comparar las codificaciones”. Llamamos a esta colación simple de todas las posibles colaciones binarias.

Pero, ¿y si queremos decir que las letras minúsculas y mayúsculas son equivalentes? Entonces tendríamos al menos dos reglas: (1) tratar las letras minúsculas ‘a’ y ‘b’ como equivalentes a ‘A’ y ‘B’; (2) luego compara las codificaciones. Llamamos a esto una intercalación insensible a mayúsculas y minúsculas. Es un poco más complejo que una intercalación binaria.

En la vida real, la mayoría de los juegos de caracteres tienen muchos caracteres: no solo ‘A’ y ‘B’ sino alfabetos enteros, a veces alfabetos múltiples o sistemas de escritura orientales con miles de caracteres, junto con muchos símbolos especiales y signos de puntuación. También en la vida real, la mayoría de las intercalaciones tienen muchas reglas: no solo insensibilidad del caso sino también insensibilidad del acento (un “acento” es una marca adjunta a un personaje como en alemán ‘ö’) y asignaciones de caracteres múltiples (como la regla de ‘ ö ‘=’ OE ‘en una de las dos colaciones alemanas).

Una encoding de caracteres es una forma de codificar caracteres para que quepan en la memoria. Es decir, si el juego de caracteres es ISO-8859-15, el símbolo del euro, €, se codificará como 0xa4, y en UTF-8, será 0xe282ac.

La intercalación es cómo comparar caracteres, en latin9, hay letras como e é è ê f , si están ordenadas por su representación binaria, irá ef é ê è pero si la colación está configurada, por ejemplo, en francés, usted ‘ Los tendré en el orden que pensabas que serían, que es todo lo que e é è ê son iguales, y luego f .

Un conjunto de caracteres es un subconjunto de todos los glifos escritos. Una encoding de caracteres especifica cómo esos caracteres se asignan a valores numéricos. Algunas codificaciones de caracteres, como UTF-8 y UTF-16, pueden codificar cualquier carácter en el conjunto de caracteres universales. Otros, como US-ASCII o ISO-8859-1 solo pueden codificar un pequeño subconjunto, ya que usan 7 y 8 bits por carácter, respectivamente. Debido a que muchos estándares especifican tanto un conjunto de caracteres como una encoding de caracteres, el término “conjunto de caracteres” a menudo se sustituye libremente por “encoding de caracteres”.

Una intercalación comprende reglas que especifican cómo se pueden comparar los caracteres para ordenar. Las reglas de intercalación pueden ser específicas de la configuración regional: el orden correcto de dos caracteres varía de un idioma a otro.

Elegir un conjunto de caracteres y una intercalación se reduce a si su aplicación está internacionalizada o no. Si no es así, ¿a qué entorno regional se dirige?

Para elegir qué conjunto de caracteres desea apoyar, debe considerar su aplicación. Si está almacenando entradas proporcionadas por el usuario, puede ser difícil prever todas las configuraciones regionales en las que eventualmente se utilizará su software. Para admitirlos a todos, podría ser mejor apoyar el UCS (Unicode) desde el principio. Sin embargo, hay un costo para esto; muchos caracteres europeos occidentales ahora requerirán dos bytes de almacenamiento por carácter en lugar de uno.

Elegir la intercalación correcta puede ayudar al rendimiento si su base de datos usa la intercalación para crear un índice, y luego usa ese índice para proporcionar resultados ordenados. Sin embargo, dado que las reglas de intercalación suelen ser específicas de la configuración regional, ese índice no tendrá valor si necesita ordenar los resultados de acuerdo con las reglas de otra configuración regional.

Sugiero usar utf8mb4_unicode_ci , que se basa en el estándar Unicode para ordenar y comparar, que ordena con precisión en una amplia gama de idiomas.