sql >> Base de Datos >  >> RDS >> Mysql

Comprensión de conjuntos de caracteres y intercalaciones en MySQL

Si alguna vez ha trabajado con MySQL, inevitablemente se encontró con juegos de caracteres y cotejos. En esta publicación de blog, intentaremos brindarle una visión más detallada de cuáles son esos dos y cómo debe usarlos.

¿Qué son los juegos de caracteres y las intercalaciones?

En pocas palabras, los conjuntos de caracteres en MySQL son conjuntos de símbolos y codificaciones; las intercalaciones son conjuntos de reglas para comparar caracteres en un conjunto de caracteres. En otras palabras, los conjuntos de caracteres son conjuntos de caracteres que son legales en una cadena, mientras que las intercalaciones son un conjunto de reglas que se utilizan para comparar caracteres en un conjunto de caracteres en particular. Así como cada conjunto de caracteres tiene una colación predeterminada, los conjuntos de caracteres también pueden tener varias colaciones. MySQL tiene un juego de caracteres predeterminado y una intercalación para el servidor y también para cada base de datos y tabla.

Conjuntos de caracteres en MySQL

En general, los juegos de caracteres en MySQL funcionan así:

  • Cuando se crea una base de datos, los conjuntos de caracteres se derivan de la variable character_set_server de todo el servidor.
  • Cuando se crea una tabla, los conjuntos de caracteres se derivan de la base de datos.
  • Cuando se crea una columna, los conjuntos de caracteres se derivan de la tabla.

En lo que respecta a los conjuntos de caracteres, hay algunas variables que debe vigilar:

  • Character_set_client define el conjunto de caracteres en el que el cliente envía las declaraciones.
  • Character_set_connection define el conjunto de caracteres al que se traducen las declaraciones después de que un servidor recibe una declaración del cliente.
  • Character_set_results define el conjunto de caracteres en el que el servidor devuelve los resultados de la consulta al cliente.

Estas tres configuraciones se pueden cambiar usando las instrucciones SET NAMES o SET CHARACTER SET, o incluso en los archivos de configuración de MySQL.

Cuando se trata de juegos de caracteres, a veces también puede encontrar un error #1267:

ERROR 1267 (HY000): Illegal mix of collations.

El error anterior generalmente se produce al comparar dos cadenas que tienen intercalaciones incompatibles o al intentar seleccionar datos que tienen una intercalación diferente en una columna combinada. El error se muestra porque cuando MySQL compara dos valores con juegos de caracteres diferentes, debe convertirlos al mismo juego de caracteres para la comparación, pero los juegos de caracteres no son compatibles. Para resolver este problema, asegúrese de que las intercalaciones de cada tabla y sus columnas sean las mismas.

Intercalaciones en MySQL

Como ya se mencionó anteriormente, las intercalaciones están estrechamente relacionadas con los conjuntos de caracteres porque una intercalación es un conjunto de reglas que define cómo comparar y ordenar cadenas de caracteres. Cada conjunto de caracteres tiene al menos una intercalación, algunos también tienen más.

Si bien no entraremos en los detalles esenciales de todas las cosas relacionadas con la intercalación en MySQL en esta publicación de blog, hay algunas cosas que debe saber:

  • Si usa MySQL 5.7, la intercalación predeterminada de MySQL es generalmente latin1_swedish_ci porque MySQL usa latin1 como su juego de caracteres predeterminado. Si usa MySQL 8.0, el conjunto de caracteres predeterminado es utf8mb4.
  • Si elige usar UTF-8 como intercalación, use siempre utf8mb4 (específicamente utf8mb4_unicode_ci). No debe usar UTF-8 porque el UTF-8 de MySQL es diferente de la codificación UTF-8 adecuada. Este es el caso porque no ofrece soporte completo de Unicode, lo que puede provocar la pérdida de datos o problemas de seguridad. Tenga en cuenta que utf8mb4_general_ci es un conjunto simplificado de reglas de clasificación que utiliza atajos diseñados para mejorar la velocidad, mientras que utf8mb4_unicode_ci clasifica con precisión en una amplia gama de idiomas. En general, utf8mb4 es el conjunto de caracteres "más seguro", ya que también admite unicode de 4 bytes, mientras que utf8 solo admite hasta 3.

Elegir un buen conjunto de caracteres y colación

Para elegir una buena intercalación y conjunto de caracteres para su conjunto de datos MySQL, recuerde mantenerlo simple. Una mezcla de diferentes conjuntos de caracteres y (o) intercalaciones puede ser un verdadero desastre, ya que pueden ser muy confusos (por ejemplo, todo puede funcionar bien hasta que aparezcan ciertos caracteres, etc.), por lo que es mejor evaluar sus necesidades por adelantado y elegir el mejor. colación y configuración de caracteres por adelantado. MySQL también tiene algunas consultas valiosas que pueden ayudarlo a hacer precisamente eso, por ejemplo, 

SELECT * FROM information_schema.CHARACTER_SETS ORDER BY CHARACTER_SET_NAME;

devolvería una lista de conjuntos de caracteres y intercalaciones disponibles junto con su descripción, lo que puede ser extremadamente útil si está planificando el diseño de su base de datos.

Tenga en cuenta que algunos conjuntos de caracteres pueden requerir más operaciones de CPU, y también pueden consumir más espacio de almacenamiento. El uso de conjuntos de caracteres incorrectos puede incluso frustrar la indexación; por ejemplo, MySQL tiene que convertir los conjuntos de caracteres para poder compararlos cuando no son iguales:la conversión puede hacer que sea imposible usar un índice.

Además, tenga en cuenta que algunas personas recomiendan "simplemente usar UTF-8 globalmente"; esto podría no ser necesariamente una gran idea porque muchas aplicaciones ni siquiera necesitan UTF-8 y, según en sus datos, UTF-8 puede causar más problemas de lo que vale (por ejemplo, puede usar mucho más espacio de almacenamiento en el disco), así que elija sabiamente.

Resumen

Los conjuntos de caracteres y las colaciones pueden ser tus amigos o una de tus pesadillas; todo depende de cómo los uses. En general, tenga en cuenta que un conjunto de caracteres y una intercalación "buenos" dependen de los datos que contiene su base de datos; MySQL proporciona algunas consultas para ayudarlo a decidir qué usar, pero para que sus conjuntos de caracteres y intercalaciones sean efectivos, también debe pensar sobre cuándo tiene sentido usar una determinada colación y por qué.