sql >> Base de Datos >  >> RDS >> Mysql

¿Es necesario SET CHARACTER SET utf8?

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 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 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:

  1. MySQL trata la consulta entrante como codificada en character_set_client .
  2. MySQL transcodifica la declaración de character_set_client en character_set_connection
  3. 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.
  4. 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 desde utf8 a latin1 (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.