Använd SET CHARACTER SET utf8
efter att ha använt SET NAMES utf8
kommer faktiskt att återställa character_set_connection
och collation_connection
till@@character_set_database
och @@collation_database
respektive.
manualen uppger att
-
SET NAMES x
motsvararSET character_set_client = x; SET character_set_results = x; SET character_set_connection = x;
-
och
SET CHARACTER SET x
motsvararSET character_set_client = x; SET character_set_results = x; SET collation_connection = @@collation_database;
medan SET collation_connection = x
exekverar även internt SET character_set_connection = <<character_set_of_collation_x>>
och SET character_set_connection = x
internt kör också SET collation_connection = <<default_collation_of_character_set_x
.
Så i huvudsak återställer du character_set_connection
till @@character_set_database
och collation_connection
till @@collation_database
. Manualen förklarar användningen av dessa variabler:
För att sammanfatta detta är kodnings-/omkodningsproceduren som MySQL använder för att bearbeta frågan och dess resultat en sak i flera steg:
- MySQL behandlar den inkommande frågan som kodad i
character_set_client
. - MySQL omkodar satsen från
character_set_client
tillcharacter_set_connection
- när man jämför strängvärden med kolumnvärden omkodar MySQL strängvärdet från
character_set_connection
in i teckenuppsättningen för den givna databaskolumnen och använder kolumnsorteringen för att sortera och jämföra. - MySQL bygger upp resultatuppsättningen kodad i
character_set_results
(detta inkluderar resultatdata såväl som resultatmetadata som kolumnnamn och så vidare)
Så det kan vara så att en SET CHARACTER SET utf8
skulle inte vara tillräckligt för att ge fullt UTF-8-stöd. Tänk på en standarddatabasteckenuppsättning latin1
och kolumner definierade med utf8
-charset och gå igenom stegen som beskrivs ovan. Som latin1
inte kan täcka alla tecken som UTF-8 kan täcka kan du förlora teckeninformation i steg 3 .
- Steg 3 : Med tanke på att din fråga är kodad i UTF-8 och innehåller tecken som inte kan representeras med
latin1
, kommer dessa tecken att gå förlorade vid omkodning frånutf8
tilllatin1
(standarddatabasteckenuppsättningen) vilket gör att din fråga misslyckas.
Så jag tror att det är säkert att säga att SET NAMES ...
är det korrekta sättet att hantera teckenuppsättningsproblem. Även om jag kan tillägga att du ställer in dina MySQL-servervariabler korrekt (alla nödvändiga variabler kan ställas in statiskt i din my.cnf
) befriar dig från prestandaoverheaden för den extra fråga som krävs vid varje anslutning.