Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como posso pesquisar por emoji no MySQL usando utf8mb4?


Você usa utf8mb4_unicode_ci para suas colunas, portanto, a verificação não diferencia maiúsculas de minúsculas. Se você usar utf8mb4_bin em vez disso, os emojis 🌮 e 🌶 são identificados corretamente como letras diferentes.

Com WEIGHT_STRING você pode obter os valores que são usados ​​para classificação e comparação para a string de entrada.

Se você escrever:
SELECT
  WEIGHT_STRING ('🌮' COLLATE 'utf8mb4_unicode_ci'),
  WEIGHT_STRING ('🌶' COLLATE 'utf8mb4_unicode_ci')

Então você pode ver que ambos são 0xfffd . Em Conjuntos de caracteres Unicode eles dizem:

Se você escrever:
SELECT 
  WEIGHT_STRING('🌮' COLLATE 'utf8mb4_bin'),
  WEIGHT_STRING('🌶' COLLATE 'utf8mb4_bin')

Você obterá seus valores unicode 0x01f32e e 0x01f336 em vez de.

Para outras letras como Ä , Á e A que são iguais se você usar utf8mb4_unicode_ci , a diferença pode ser observada em:
SELECT
  WEIGHT_STRING ('Ä' COLLATE 'utf8mb4_unicode_ci'),
  WEIGHT_STRING ('A' COLLATE 'utf8mb4_unicode_ci')

Esses mapeiam para o 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

De acordo com:Diferença entre os agrupamentos utf8mb4_unicode_ci e utf8mb4_unicode_520_ci no MariaDB/MySQL? os pesos usados ​​para utf8mb4_unicode_ci são baseados em UCA 4.0.0 porque o emoji não aparece lá, o peso mapeado é 0xfffd

Se você precisar de comparações e classificações sem distinção entre maiúsculas e minúsculas para letras regulares junto com emoji, esse problema será resolvido usando utf8mb4_unicode_520_ci :
SELECT
  WEIGHT_STRING('🌮' COLLATE 'utf8mb4_unicode_520_ci'),
  WEIGHT_STRING('🌶' COLLATE 'utf8mb4_unicode_520_ci')

também haverá pesos diferentes para esses emojis 0xfbc3f32e e 0xfbc3f336 .