Usi utf8mb4_unicode_ci
per le tue colonne, quindi il controllo non fa distinzione tra maiuscole e minuscole. Se usi utf8mb4_bin
invece, le emoji 🌮 e 🌶 vengono correttamente identificate come lettere diverse.
Con WEIGHT_STRING
puoi ottenere i valori che vengono utilizzati per l'ordinamento e il confronto per la stringa di input.
Se scrivi:
SELECT
WEIGHT_STRING ('🌮' COLLATE 'utf8mb4_unicode_ci'),
WEIGHT_STRING ('🌶' COLLATE 'utf8mb4_unicode_ci')
Quindi puoi vedere che entrambi sono 0xfffd
. In Set di caratteri Unicode
dicono:
Se scrivi:
SELECT
WEIGHT_STRING('🌮' COLLATE 'utf8mb4_bin'),
WEIGHT_STRING('🌶' COLLATE 'utf8mb4_bin')
Otterrai i loro valori unicode 0x01f32e
e 0x01f336
invece.
Per altre lettere come Ä
, Á
e A
che sono uguali se usi utf8mb4_unicode_ci
, la differenza può essere vista in:
SELECT
WEIGHT_STRING ('Ä' COLLATE 'utf8mb4_unicode_ci'),
WEIGHT_STRING ('A' COLLATE 'utf8mb4_unicode_ci')
Quelli mappano 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
Secondo:Differenza tra le regole di confronto utf8mb4_unicode_ci e utf8mb4_unicode_520_ci in MariaDB/MySQL?
i pesi usati per utf8mb4_unicode_ci
sono basati su UCA 4.0.0
poiché le emoji non compaiono lì, il peso mappato è 0xfffd
Se hai bisogno di confronti e ordinamenti senza distinzione tra maiuscole e minuscole per lettere regolari insieme a emoji, questo problema viene risolto utilizzando utf8mb4_unicode_520_ci
:
SELECT
WEIGHT_STRING('🌮' COLLATE 'utf8mb4_unicode_520_ci'),
WEIGHT_STRING('🌶' COLLATE 'utf8mb4_unicode_520_ci')
ci saranno anche pesi diversi per quelle emoji 0xfbc3f32e
e 0xfbc3f336
.