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é:
- MySQL považuje příchozí dotaz za zakódovaný v
character_set_client
. - MySQL překóduje příkaz z
character_set_client
docharacter_set_connection
- 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í. - 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í zutf8
nalatin1
(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í.