¿Qué significan exactamente el conjunto de caracteres y la clasificación?

316

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

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

Sander Versluys
fuente

Respuestas:

512

Desde documentos de MySQL :

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

Supongamos que tenemos un alfabeto con cuatro letras: 'A', 'B', 'a', 'b'. 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 codificación de 'A' , y la combinación de las cuatro letras y sus codificaciones es un conjunto de caracteres.

Ahora, supongamos que queremos comparar dos valores de cadena, 'A' y 'B'. La forma más sencilla de hacer esto 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 recopilación es un conjunto de reglas (solo una regla en este caso): "comparar las codificaciones". Llamamos a esta colación más simple de todas las colaciones binarias.

Pero, ¿qué pasa 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 compare las codificaciones. Llamamos a esto una colación que no distingue entre mayúsculas y minúsculas. Es un poco más complejo que una colació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 colaciones tienen muchas reglas: no solo la insensibilidad a las mayúsculas y minúsculas, sino también la insensibilidad de acento (un "acento" es una marca adjunta a un carácter como en alemán "ö") y mapeos de caracteres múltiples (como la regla que " ö '=' OE 'en una de las dos colaciones alemanas).

Dan Esparza
fuente
206

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

La clasificación es cómo comparar caracteres, en latin9, hay letras ya que e é è ê f, si se ordenan por su representación binaria, irán, e f é ê èpero si la clasificación se establece en, por ejemplo, francés, las tendrá en el orden en que pensó que sería, que es todos e é è êson iguales, y luego f.

estera
fuente
55
Es importante tener en cuenta que podría haber muchas intercalaciones diferentes para un solo juego de caracteres. El "correcto" depende de la semántica del texto, que normalmente está determinada por el idioma en el que está escrito.
Phil
20

Un conjunto de caracteres es un subconjunto de todos los glifos escritos. Una codificación 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 universal. 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 codificación de caracteres, el término "conjunto de caracteres" a menudo se sustituye libremente por "codificación de caracteres".

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

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

Para elegir qué conjunto de caracteres desea admitir, 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 admitir el UCS (Unicode) desde el principio. Sin embargo, esto tiene un costo; muchos caracteres de Europa occidental ahora requerirán dos bytes de almacenamiento por carácter en lugar de uno.

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

erickson
fuente
lo siento amigo, solo soy principiante y solo necesito tu aclaración. Entonces, ¿puedo entender la colación de esta manera? Es lo que garantiza que cada carácter (ya sea latino o chino) se reconozca correctamente y se les den las codificaciones respectivas. ¿Es eso correcto? Espero su respuesta
Mirich
1
@Mirich No, la recopilación es información sobre cómo ordenar los caracteres. Diferentes regiones del mundo prefieren ordenar los personajes de diferentes maneras.
erickson
3

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

simhumileco
fuente
3
del OP: "Estoy pidiendo una explicación de los dos y cómo elegirlos"
Dan Esparza
1
@simhumileco, lo siento amigo, solo soy principiante y solo necesito tu aclaración. Entonces, ¿puedo entender la colación de esta manera? Es lo que garantiza que cada carácter (ya sea latino o chino) se reconozca correctamente y se les den las codificaciones respectivas. ¿Es eso correcto? Espero su respuesta
Mirich
1
@Mirich Todo depende de la codificación que use en otros lugares, si usa la UTF-8codificación en un sistema fuera de la base de datos, entonces todo en la base de datos también debe escribirse correctamente si lo usa utf8mb4en MySQL . Cuando se trata de la operación correcta de ordenar, comparar y transformar texto para caracteres específicos en MySQL , es difícil encontrar la solución perfecta, pero *_unicode_ciciertamente es mejor *_general, pero también tiene sus inconvenientes. Por favor lee: dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
simhumileco