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
.