Usando
SET CHARACTER SET utf8
depois de usar SET NAMES utf8
irá redefinir o character_set_connection
e collation_connection
para@@character_set_database
e @@collation_database
respectivamente. O manual afirma que
-
SET NAMES x
é equivalente a
SET character_set_client = x; SET character_set_results = x; SET character_set_connection = x;
-
eSET CHARACTER SET x
é equivalente a
SET character_set_client = x; SET character_set_results = x; SET collation_connection = @@collation_database;
considerando que
SET collation_connection = x
também executa internamente SET character_set_connection = <<character_set_of_collation_x>>
e SET character_set_connection = x
internamente também executa SET collation_connection = <<default_collation_of_character_set_x
. Então, basicamente, você está redefinindo
character_set_connection
para @@character_set_database
e collation_connection
para @@collation_database
. O manual explica o uso dessas variáveis:Para resumir, o procedimento de codificação/transcodificação que o MySQL usa para processar a consulta e seus resultados é uma coisa de várias etapas:
- O MySQL trata a consulta recebida como sendo codificada em
character_set_client
. - O MySQL transcodifica a instrução de
character_set_client
emcharacter_set_connection
- ao comparar valores de string com valores de coluna, o MySQL transcodifica o valor de string de
character_set_connection
no conjunto de caracteres da coluna do banco de dados fornecida e usa o agrupamento de colunas para classificar e comparar. - O MySQL cria o conjunto de resultados codificado em
character_set_results
(isso inclui dados de resultados e metadados de resultados, como nomes de colunas e assim por diante)
Portanto, pode ser o caso de um
SET CHARACTER SET utf8
não seria suficiente para fornecer suporte UTF-8 completo. Pense em um conjunto de caracteres de banco de dados padrão de latin1
e colunas definidas com utf8
-charset e siga os passos descritos acima. Como latin1
não pode cobrir todos os caracteres que o UTF-8 pode cobrir você pode perder as informações dos caracteres na etapa 3 . - Etapa 3 : Dado que sua consulta está codificada em UTF-8 e contém caracteres que não podem ser representados com
latin1
, esses caracteres serão perdidos na transcodificação deutf8
paralatin1
(o conjunto de caracteres padrão do banco de dados) fazendo com que sua consulta falhe.
Então acho que é seguro dizer que
SET NAMES ...
é a maneira correta de lidar com problemas de conjunto de caracteres. Mesmo que eu possa adicionar isso configurando suas variáveis do servidor MySQL corretamente (todas as variáveis necessárias podem ser definidas estaticamente em seu my.cnf
) libera você da sobrecarga de desempenho da consulta extra necessária em cada conexão.