Usas utf8mb4_unicode_ci
para sus columnas, por lo que la verificación no distingue entre mayúsculas y minúsculas. Si usa utf8mb4_bin
en cambio, los emoji 🌮 y 🌶 se identifican correctamente como letras diferentes.
Con WEIGHT_STRING
puede obtener los valores que se usan para clasificar y comparar la cadena de entrada.
Si escribes:
SELECT
WEIGHT_STRING ('🌮' COLLATE 'utf8mb4_unicode_ci'),
WEIGHT_STRING ('🌶' COLLATE 'utf8mb4_unicode_ci')
Entonces puedes ver que ambos son 0xfffd
. En Conjuntos de caracteres Unicode
dicen:
Si escribes:
SELECT
WEIGHT_STRING('🌮' COLLATE 'utf8mb4_bin'),
WEIGHT_STRING('🌶' COLLATE 'utf8mb4_bin')
Obtendrá sus valores Unicode 0x01f32e
y 0x01f336
en su lugar.
Para otras letras como Ä
, Á
y A
que son iguales si usas utf8mb4_unicode_ci
, la diferencia se puede ver en:
SELECT
WEIGHT_STRING ('Ä' COLLATE 'utf8mb4_unicode_ci'),
WEIGHT_STRING ('A' COLLATE 'utf8mb4_unicode_ci')
Esos se asignan al peso 0x0E33
Ä: 00C4 ; [.0E33.0020.0008.0041][.0000.0047.0002.0308] # LATIN CAPITAL LETTER A WITH DIAERESIS; QQCM
A: 0041 ; [.0E33.0020.0008.0041] # LATIN CAPITAL LETTER A
Según:¿Diferencia entre las colaciones utf8mb4_unicode_ci y utf8mb4_unicode_520_ci en MariaDB/MySQL?
los pesos utilizados para utf8mb4_unicode_ci
se basan en UCA 4.0.0
porque el emoji no aparece ahí, el peso mapeado es 0xfffd
Si necesita comparaciones y clasificaciones que no distinguen entre mayúsculas y minúsculas para letras regulares junto con emoji, entonces este problema se resuelve usando utf8mb4_unicode_520_ci
:
SELECT
WEIGHT_STRING('🌮' COLLATE 'utf8mb4_unicode_520_ci'),
WEIGHT_STRING('🌶' COLLATE 'utf8mb4_unicode_520_ci')
también habrá diferentes pesos para esos emoji 0xfbc3f32e
y 0xfbc3f336
.