Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SET CHARACTER SET utf8 é necessário?


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;
    

  • e SET 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:
  1. O MySQL trata a consulta recebida como sendo codificada em character_set_client .
  2. O MySQL transcodifica a instrução de character_set_client em character_set_connection
  3. 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.
  4. 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 de utf8 para latin1 (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.