Para aquellas personas que todavía llegan a esta pregunta en 2020 o más tarde, hay opciones más nuevas que pueden ser mejores que ambas de estos. Por ejemplo, utf8mb4_0900_ai_ci
.
Todas estas intercalaciones son para la codificación de caracteres UTF-8. Las diferencias están en cómo se ordena y compara el texto.
_unicode_ci
y _general_ci
son dos conjuntos diferentes de reglas para clasificar y comparar texto según lo esperado. Las versiones más nuevas de MySQL también introducen nuevos conjuntos de reglas, como _0900_ai_ci
para reglas equivalentes basadas en Unicode 9.0 - y sin equivalente _general_ci
variante. Las personas que lean esto ahora probablemente deberían usar una de estas intercalaciones más nuevas en lugar de _unicode_ci
o _general_ci
. La descripción de las intercalaciones más antiguas a continuación se proporciona solo como interés.
MySQL actualmente está en transición desde una implementación UTF-8 más antigua y defectuosa. Por ahora, necesitas usar utf8mb4
en lugar de utf8
para la parte de codificación de caracteres, para asegurarse de obtener la versión corregida. La versión defectuosa permanece por compatibilidad con versiones anteriores, aunque está obsoleta.
Diferencias clave
-
utf8mb4_unicode_ci
se basa en las reglas oficiales de Unicode para clasificación y comparación universales, que clasifica con precisión en una amplia variedad de idiomas. -
utf8mb4_general_ci
es un conjunto simplificado de reglas de clasificación que tiene como objetivo hacer lo mejor posible mientras toma muchos atajos diseñados para mejorar la velocidad. No sigue las reglas de Unicode y resultará en una clasificación o comparación no deseada en algunas situaciones, como cuando se usan idiomas o caracteres particulares.En los servidores modernos, este aumento de rendimiento será casi insignificante. Fue ideado en una época en que los servidores tenían una pequeña fracción del rendimiento de la CPU de las computadoras actuales.
Beneficios de utf8mb4_unicode_ci
sobre utf8mb4_general_ci
utf8mb4_unicode_ci
, que usa las reglas de Unicode para ordenar y comparar, emplea un algoritmo bastante complejo para ordenar correctamente en una amplia gama de idiomas y cuando usa una amplia gama de caracteres especiales. Estas reglas deben tener en cuenta las convenciones específicas del idioma; no todo el mundo ordena sus caracteres en lo que llamaríamos "orden alfabético".
En lo que respecta a los idiomas latinos (es decir, "europeos"), no hay mucha diferencia entre la clasificación Unicode y el utf8mb4_general_ci
simplificado. clasificación en MySQL, pero todavía hay algunas diferencias:
-
Por ejemplo, la intercalación Unicode ordena "ß" como "ss" y "Œ" como "OE" como normalmente querrían las personas que usan esos caracteres, mientras que
utf8mb4_general_ci
los ordena como caracteres individuales (presumiblemente como "s" y "e" respectivamente). -
Algunos caracteres Unicode se definen como ignorables, lo que significa que no deben contar para el orden de clasificación y la comparación debe pasar al siguiente carácter.
utf8mb4_unicode_ci
los maneja correctamente.
En idiomas no latinos, como idiomas asiáticos o idiomas con diferentes alfabetos, puede haber mucho más diferencias entre la clasificación Unicode y el utf8mb4_general_ci
simplificado clasificación. La idoneidad de utf8mb4_general_ci
dependerá en gran medida del idioma utilizado. Para algunos idiomas, será bastante inadecuado.
¿Qué debes usar?
Es casi seguro que no hay razón para usar utf8mb4_general_ci
más, ya que hemos dejado atrás el punto en el que la velocidad de la CPU es lo suficientemente baja como para que la diferencia de rendimiento sea importante. Es casi seguro que su base de datos estará limitada por otros cuellos de botella además de este.
En el pasado, algunas personas recomendaban usar utf8mb4_general_ci
excepto cuando la clasificación precisa iba a ser lo suficientemente importante como para justificar el costo de rendimiento. Hoy en día, ese costo de rendimiento casi ha desaparecido y los desarrolladores están tratando la internacionalización con más seriedad.
Se puede argumentar que si la velocidad es más importante para usted que la precisión, es mejor que no haga ninguna clasificación. Es trivial hacer que un algoritmo sea más rápido si no necesita que sea preciso. Entonces, utf8mb4_general_ci
es un compromiso que probablemente no sea necesario por razones de velocidad y probablemente tampoco sea adecuado por razones de precisión.
Otra cosa que agregaré es que incluso si sabe que su aplicación solo es compatible con el idioma inglés, es posible que aún deba tratar con los nombres de las personas, que a menudo pueden contener caracteres utilizados en otros idiomas en los que es igual de importante ordenarlos correctamente. . El uso de las reglas de Unicode para todo ayuda a tener la tranquilidad de saber que la gente inteligente de Unicode ha trabajado muy duro para que la clasificación funcione correctamente.
Qué significan las partes
En primer lugar, ci
es para no distingue entre mayúsculas y minúsculas clasificación y comparación. Esto significa que es adecuado para datos textuales y las mayúsculas y minúsculas no son importantes. Los otros tipos de intercalación son cs
(sensible a mayúsculas y minúsculas) para datos textuales donde las mayúsculas y minúsculas son importantes, y bin
, donde la codificación debe coincidir, bit a bit, lo cual es adecuado para campos que son realmente datos binarios codificados (incluido, por ejemplo, Base64). La clasificación que distingue entre mayúsculas y minúsculas conduce a algunos resultados extraños y la comparación entre mayúsculas y minúsculas puede dar como resultado valores duplicados que difieren solo en mayúsculas y minúsculas, por lo que las intercalaciones que distinguen entre mayúsculas y minúsculas están cayendo en desgracia para los datos textuales. y así sucesivamente probablemente también sea significativo, y una intercalación binaria podría ser más apropiada.
A continuación, unicode
o general
se refiere a las reglas específicas de clasificación y comparación, en particular, la forma en que se normaliza o compara el texto. Hay muchos conjuntos diferentes de reglas para la codificación de caracteres utf8mb4, con unicode
y general
siendo dos que intentan funcionar bien en todos los idiomas posibles en lugar de uno específico. Las diferencias entre estos dos conjuntos de reglas son el tema de esta respuesta. Tenga en cuenta que unicode
utiliza reglas de Unicode 4.0. Las versiones recientes de MySQL agregan los conjuntos de reglas unicode_520
usando reglas de Unicode 5.2 y 0900
(soltando la parte "unicode_") usando las reglas de Unicode 9.0.
Y por último, utf8mb4
es, por supuesto, la codificación de caracteres utilizada internamente. En esta respuesta solo hablo de codificaciones basadas en Unicode.