Mysql
 sql >> Database >  >> RDS >> Mysql

Come posso cercare per emoji in MySQL usando utf8mb4?

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 .