sql >> Databáze >  >> RDS >> Mysql

Jak mohu vyhledávat podle emotikonů v MySQL pomocí utf8mb4?

Používáte utf8mb4_unicode_ci pro vaše sloupce, takže kontrola nerozlišuje malá a velká písmena. Pokud používáte utf8mb4_bin místo toho jsou emotikony 🌮 a 🌶 správně identifikovány jako různá písmena.

S WEIGHT_STRING můžete získat hodnoty, které se používají pro třídění a porovnání pro vstupní řetězec.

Pokud napíšete:

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

Pak můžete vidět, že oba jsou 0xfffd . V znakové sady Unicode říkají:

Pokud napíšete:

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

Získáte jejich hodnoty unicode 0x01f32e a 0x01f336 místo toho.

Pro ostatní písmena jako Ä , Á a A které jsou stejné, pokud použijete utf8mb4_unicode_ci , rozdíl je vidět v:

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

Ty se mapují na váhu 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

Podle :Rozdíl mezi kolacemi utf8mb4_unicode_ci a utf8mb4_unicode_520_ci v MariaDB/MySQL? váhy používané pro utf8mb4_unicode_ci jsou založeny na UCA 4.0.0 protože se tam emotikony nezobrazují, mapovaná váha je 0xfffd

Pokud potřebujete porovnávat a třídit běžná písmena bez ohledu na velikost písmen spolu s emotikony, pak je tento problém vyřešen pomocí utf8mb4_unicode_520_ci :

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

budou také mít různé váhy pro tyto emotikony 0xfbc3f32e a 0xfbc3f336 .



  1. Rozdíl mezi CTE a SubQuery?

  2. Nevýhody citování celých čísel v dotazu Mysql?

  3. MySQL s Entity Framework - co dělám špatně?

  4. Lepší způsob, jak uložit heslo v mysql, které lze dešifrovat také pomocí php