Ver Mensaje Individual
  #25 (permalink)  
Antiguo 13/07/2011, 00:32
Avatar de abimaelrc
abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: FAQ's de MySQL

Pregunta: ¿"SET CHARACTER SET utf8" es necesario cuando estoy trabajando con data codificada en UTF8?
Respuesta:
Información tomada de http://stackoverflow.com/questions/1...utf8-necessary
Cita:
Usar SET CHARACTER SET utf8 después de usar SET NAMES utf8 realmente restablece el character_set_connection y collation_connection a @@character_set_database y @@collation_database respectivamente.

El manual indica que

SET NAMES x es equivalente a

SET character_set_client = x;
SET character_set_results= x;
SET character_set_connection = x;

y SET CHARACTER SET X es equivalente a

SET character_set_client = x;
SET character_set_results = x;
SET collation_connection = @@collation_database;
mientras que SET collation_connection = x internamente tambien ejecuta SET character_set_connection = <<character_set_of_collation_x>> y SET character_set_connection = x internamente ejecuta tambien SET collation_connection = <<default_collation_of_character_set_x.

Así que, esencialmente estás restableciendo character_set_connection a @@character_set_database y collation_connection a @@collation_database. El manual explica el uso de estas variables:

Cita:
¿ Qué conjunto de caracteres debería usar el servidor para traducir una consulta tras recibirla?

Para esto, el servidor usa character_set_connection y collation_connection. Esto convierte las consultas enviadas por el cliente de character_set_client a character_set_connection (excepto para cadenas de caracteres literales que tienen un introductor como _latin1 o _utf8). collation_connection es importante para comparaciones de cadenas de caracteres literales. Para comparaciones de cadenas de caracteres con valores de columnas no importa, ya que las columnas tienen una precedencia mayor en las colaciones.
Para resumir, el procedimiento de MySQL codificación / transcodificación que utiliza para procesar la consulta y sus resultados es una cosa-multi-paso:

1. MySQL trata la consulta entrante como codificado en character_set_client.
2. MySQL transcodifica la declaración de character_set_client en character_set_connection cuando se comparan los valores de la cadena de valores de columna MySQL transcodifica el valor de la cadena de character_set_connection en el chracter conjunto de la columna de la base de datos y utiliza la intercalación de columna para hacer la comparación y ordenación.
3. MySQL acumula el conjunto de resultados codificados en character_set_results (esto incluye datos de los resultados, así como metadatos resultantes como nombres de columna y así sucesivamente)
Por lo tanto, podría ser el caso de que un conjunto de caracteres Utf8 no sería suficiente para proporcionar completo de UTF-8. Piense en una base de datos de carácter conjunto predeterminado de latin1 y las columnas definidas con utf8-charset y seguir 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: Teniendo en cuenta que la consulta está codificado en UTF-8 y contiene caracteres que no se puede representar con latin1, estos personajes se pierden en la transcodificación de utf8 a latin1 (la base de datos por defecto del juego de caracteres) de no poder hacer su consulta.

Así que creo que es seguro decir que SET NAMES ... es la forma correcta de manejar los problemas del conjunto de caracteres. A pesar de que podría añadir que la creación de las variables del servidor MySQL correctamente (todas las variables reuired se puede configurar de forma estática en el my.cnf) le libera de la sobrecarga de rendimiento de la consulta adicional que se requiere en cada conexión.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos