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

Je nutné SET CHARACTER SET utf8?

Pomocí SET CHARACTER SET utf8 po použití SET NAMES utf8 ve skutečnosti resetuje character_set_connection a collation_connection do
@@character_set_database a @@collation_database respektive.

příručka uvádí, že

  • SET NAMES x je ekvivalentní

    SET character_set_client = x;
    SET character_set_results = x;
    SET character_set_connection = x;
    
  • a SET CHARACTER SET x je ekvivalentní

    SET character_set_client = x;
    SET character_set_results = x;
    SET collation_connection = @@collation_database;
    

zatímco SET collation_connection = x také interně spustí SET character_set_connection = <<character_set_of_collation_x>> a SET character_set_connection = x interně také provede SET collation_connection = <<default_collation_of_character_set_x .

V podstatě tedy resetujete character_set_connection do @@character_set_database a collation_connection do @@collation_database . Manuál vysvětluje použití těchto proměnných:

Abychom to shrnuli, procedura kódování/překódování, kterou MySQL používá ke zpracování dotazu, a její výsledky jsou vícekrokové:

  1. MySQL považuje příchozí dotaz za zakódovaný v character_set_client .
  2. MySQL překóduje příkaz z character_set_client do character_set_connection
  3. při porovnávání hodnot řetězců s hodnotami sloupců MySQL překóduje hodnotu řetězce z character_set_connection do znakové sady daného databázového sloupce a použije řazení sloupců k řazení a porovnávání.
  4. MySQL vytvoří sadu výsledků zakódovanou v character_set_results (to zahrnuje data výsledků i metadata výsledků, jako jsou názvy sloupců a tak dále)

Může se tedy stát, že SET CHARACTER SET utf8 by nepostačovalo k poskytování plné podpory UTF-8. Představte si výchozí znakovou sadu databáze latin1 a sloupce definované pomocí utf8 -charset a projděte výše popsanými kroky. Jako latin1 nemůže pokrýt všechny znaky, které může pokrýt UTF-8, můžete ztratit informace o znaku v kroku 3 .

  • Krok 3 : Vzhledem k tomu, že váš dotaz je zakódován v UTF-8 a obsahuje znaky, které nelze reprezentovat latin1 , tyto znaky budou ztraceny při překódování z utf8 na latin1 (výchozí znaková sada databáze), což způsobí selhání vašeho dotazu.

Takže si myslím, že je bezpečné říci, že SET NAMES ... je správný způsob řešení problémů se znakovými sadami. I když bych mohl dodat, že správné nastavení proměnných serveru MySQL (všechny požadované proměnné lze nastavit staticky ve vašem my.cnf ) vás zbaví režie výkonu souvisejícího s dodatečným dotazem vyžadovaným při každém připojení.



  1. Mysql:Jak se dotazovat na sloupec, jehož typ je bit?

  2. Porovnávací algoritmus v SQL

  3. Jak zapíšu LINQ's .Skip(1000).Take(100) v čistém SQL?

  4. MariaDB ROUND() vs. FLOOR()