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
.