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

¿Cómo puedo buscar por emoji en MySQL usando utf8mb4?

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 .