Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment puis-je rechercher par emoji dans MySQL en utilisant utf8mb4 ?

Vous utilisez utf8mb4_unicode_ci pour vos colonnes, la vérification est donc insensible à la casse. Si vous utilisez utf8mb4_bin à la place, les emoji 🌮 et 🌶 sont correctement identifiés comme des lettres différentes.

Avec WEIGHT_STRING vous pouvez obtenir les valeurs utilisées pour le tri et la comparaison de la chaîne d'entrée.

Si vous écrivez :

SELECT
  WEIGHT_STRING ('🌮' COLLATE 'utf8mb4_unicode_ci'),
  WEIGHT_STRING ('🌶' COLLATE 'utf8mb4_unicode_ci')

Ensuite, vous pouvez voir que les deux sont 0xfffd . Dans jeux de caractères Unicode ils disent :

Si vous écrivez :

SELECT 
  WEIGHT_STRING('🌮' COLLATE 'utf8mb4_bin'),
  WEIGHT_STRING('🌶' COLLATE 'utf8mb4_bin')

Vous obtiendrez leurs valeurs unicode 0x01f32e et 0x01f336 à la place.

Pour les autres lettres comme Ä , Á et A qui sont égaux si vous utilisez utf8mb4_unicode_ci , la différence peut être vue dans :

SELECT
  WEIGHT_STRING ('Ä' COLLATE 'utf8mb4_unicode_ci'),
  WEIGHT_STRING ('A' COLLATE 'utf8mb4_unicode_ci')

Ceux-ci correspondent au poids 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

Selon :Différence entre les classements utf8mb4_unicode_ci et utf8mb4_unicode_520_ci dans MariaDB/MySQL ? les poids utilisés pour utf8mb4_unicode_ci sont basés sur UCA 4.0.0 parce que les emoji n'y apparaissent pas, le poids mappé est 0xfffd

Si vous avez besoin de comparaisons et de tris insensibles à la casse pour les lettres régulières avec les emoji, ce problème est résolu en utilisant utf8mb4_unicode_520_ci :

SELECT
  WEIGHT_STRING('🌮' COLLATE 'utf8mb4_unicode_520_ci'),
  WEIGHT_STRING('🌶' COLLATE 'utf8mb4_unicode_520_ci')

il y aura également des poids différents pour ces emoji 0xfbc3f32e et 0xfbc3f336 .