Usando SET CHARACTER SET utf8
después de usar SET NAMES utf8
en realidad restablecerá la character_set_connection
y collation_connection
a@@character_set_database
y @@collation_database
respectivamente.
El manual afirma que
-
SET NAMES x
es equivalente aSET character_set_client = x; SET character_set_results = x; SET character_set_connection = x;
-
y
SET CHARACTER SET x
es equivalente aSET character_set_client = x; SET character_set_results = x; SET collation_connection = @@collation_database;
mientras que SET collation_connection = x
también ejecuta internamente SET character_set_connection = <<character_set_of_collation_x>>
y SET character_set_connection = x
internamente también ejecuta SET collation_connection = <<default_collation_of_character_set_x
.
Básicamente, estás reiniciando character_set_connection
a @@character_set_database
y collation_connection
a @@collation_database
. El manual explica el uso de estas variables:
Para resumir esto, el procedimiento de codificación/transcodificación que utiliza MySQL para procesar la consulta y sus resultados es una cosa de varios pasos:
- MySQL trata la consulta entrante como codificada en
character_set_client
. - MySQL transcodifica la declaración de
character_set_client
encharacter_set_connection
- al comparar valores de cadena con valores de columna, MySQL transcodifica el valor de cadena de
character_set_connection
en el conjunto de caracteres de la columna de la base de datos dada y usa la colación de columnas para ordenar y comparar. - MySQL crea el conjunto de resultados codificado en
character_set_results
(esto incluye datos de resultados, así como metadatos de resultados, como nombres de columnas, etc.)
Entonces podría darse el caso de que un SET CHARACTER SET utf8
no sería suficiente para proporcionar soporte completo para UTF-8. Piense en un conjunto de caracteres de base de datos predeterminado de latin1
y columnas definidas con utf8
-charset y siga los pasos descritos anteriormente. Como latin1
no puede cubrir todos los caracteres que UTF-8 puede cubrir, puede perder información de carácter en el paso 3 .
- Paso 3 : Dado que su consulta está codificada en UTF-8 y contiene caracteres que no se pueden representar con
latin1
, estos caracteres se perderán al transcodificar desdeutf8
alatin1
(el conjunto de caracteres predeterminado de la base de datos) haciendo que su consulta falle.
Así que creo que es seguro decir que SET NAMES ...
es la forma correcta de manejar los problemas de juego de caracteres. Aunque podría agregar que configurar las variables de su servidor MySQL correctamente (todas las variables requeridas se pueden configurar estáticamente en su my.cnf
) lo libera de la sobrecarga de rendimiento de la consulta adicional requerida en cada conexión.