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.
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.
Respuestas:
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).
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
.
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.
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.
UTF-8
codificació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 utf8mb4
en 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_ci
ciertamente es mejor *_general
, pero también tiene sus inconvenientes. Por favor lee: dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html