it-swarm.dev

SET NAMES utf8 no MySQL?

Muitas vezes vejo algo semelhante a este abaixo em scripts PHP usando o MySQL

query("SET NAMES utf8");   

Eu nunca tive que fazer isso para qualquer projeto ainda, então eu tenho algumas perguntas básicas sobre isso. 

  1. Isso é algo que é feito apenas com o PDO?
  2. Se não é uma coisa específica do PDO, então qual é o propósito de fazê-lo? Eu percebo que está definindo a codificação para o mysql, mas eu nunca tive que usá-lo, então por que eu iria querer usá-lo? 
100
JasonDavis

É necessário sempre que você quiser enviar dados para o servidor com caracteres que não podem ser representados em ASCII puro, como 'ñ' ou 'ö'.

Isso se a instância do MySQL não estiver configurada para esperar a codificação UTF-8 por padrão das conexões do cliente (muitas são, dependendo da sua localização e plataforma).

Leia http://www.joelonsoftware.com/articles/Unicode.html caso você não saiba como o Unicode funciona.

Leia Se usar "SET NAMES" para ver as alternativas de SET NAMES e o que é exatamente isso.

69
Vinko Vrsalovic

A partir do manual :

SET NAMES indica qual conjunto de caracteres O cliente usará para enviar instruções SQL Para o servidor.

Mais elaboradamente, (e mais uma vez, gratuitamente extraído do manual ):

SET NAMES indica qual conjunto de caracteres O cliente usará para enviar instruções SQL Para o servidor. Assim, SET NAMES 'cp1251' informa ao servidor, “Futuras mensagens recebidas deste cliente Estão no conjunto de caracteres cp1251.” Também especifica o caractere defina que o servidor deve usar para enviar os resultados de de volta ao cliente. (Por Exemplo, indica qual caractere Definido para usar para valores de coluna se você Usar uma instrução SELECT.)

42
karim79

Obter codificação correta é realmente complicado - existem muitas camadas:

  • Navegador
  • Página
  • PHP
  • MySQL

O comando SQL "SET CHARSET utf8" de PHP irá garantir que o lado do cliente (PHP) irá obter os dados em utf8, não importa como eles são armazenados no banco de dados. Claro, eles precisam ser armazenados corretamente primeiro.

Definição de DDL vs. dados reais

A codificação definida para uma tabela/coluna não significa realmente que os dados estejam nessa codificação. Se você tiver uma tabela definida como utf8 mas armazenada como uma codificação diferente, o MySQL as tratará como utf8 e você terá problemas. O que significa que você tem que consertar isso primeiro.

O que verificar

Você precisa verificar em qual codificação o fluxo de dados em cada camada.

  • Verifique os cabeçalhos e cabeçalhos HTTP.
  • Verifique o que realmente é enviado no corpo da solicitação.
  • Não esqueça que o MySQL tem codificação em quase todos os lugares:
    • Base de dados
    • Tabelas
    • Colunas
    • Servidor como um todo
    • Cliente
      Certifique-se de que há o caminho certo em todos os lugares.

Conversão

Se você receber dados em, e. windows-1250, e quer armazenar em utf-8, então use este SQL antes de armazenar:

SET NAMES 'cp1250';

Se você tiver dados no banco de dados como windows-1250 e quiser recuperar utf8, use:

SET CHARSET 'utf8';

Última nota:

Não confie em ferramentas "inteligentes" demais para mostrar os dados. Por exemplo. phpMyAdmin faz (estava fazendo quando eu estava usando) codificação muito ruim. E passa por todas as camadas, então é difícil descobrir. Além disso, o Internet Explorer tinha um comportamento realmente estúpido de "adivinhar" a codificação baseada em regras estranhas. Use editores simples onde você pode mudar a codificação. Além disso, eu recomendo o MySQL Workbench.

27
Ondra Žižka

Esta consulta deve ser escrita antes da consulta que cria ou atualiza dados no banco de dados, esta consulta se parece com:

mysql_query("set names 'utf8'");

Note que você deve escrever a codificação que você está usando no cabeçalho, por exemplo, se você estiver usando utf-8, você adiciona-lo assim no cabeçalho ou vai couse um problema com o Internet Explorer

para que sua página fique assim

<html>
    <head>
        <title>page title</title>
        <meta charset="UTF-8" />   
    </head>
    <body>
    <?php
            mysql_query("set names 'utf8'");   
            $sql = "INSERT * FROM ..... ";  
            mysql_query($sql);
    ?>    

    </body>
<html>
17
usama sulaiman

A solução é 

 $conn->set_charset("utf8");
8
nurp

Em vez de fazer isso através de uma consulta SQL, use a função php: mysqli :: set_charset Mysqli_set_charset

Note:

This is the preferred way to change the charset. Using mysqli_query() to set it (such as SET NAMES utf8) is not recommended.

Veja a seção de conceitos do conjunto de caracteres MySQL para mais informações.

de http://www.php.net/manual/en/mysqli.set-charset.php

5
user1783273

Obrigado @all!

não use: query ("SET NAMES utf8"); isso é material de configuração e não uma consulta. coloque-o logo depois de iniciar uma conexão com setCharset () (ou método similar) 

alguma coisinha no parctice: 

status: 

  • servidor mysql por padrão fala latin1
  • seu aplicativo buraco está em utf8
  • a conexão é feita sem nenhum extra (então: latin1) (sem SET NAMES utf8 ..., sem set_charset () método/função)

Armazenar e ler dados não é problema, pois o mysql pode manipular os caracteres. se você olhar no banco de dados, você já verá que há uma porcaria nele (por exemplo, usando o phpmyadmin). 

até agora isso não é um problema! (errado mas funciona frequentemente (na europa)) ..

.. a menos que outro cliente/programa ou uma biblioteca alterada, que funcione corretamente, leia/salve dados. então você está em apuros!

1
user3162905

Não só o DOP. Se sql responder como '????' símbolos, preset de você charset (espero UTF-8) realmente recomendado:

if (!$mysqli->set_charset("utf8")) 
 { printf("Can't set utf8: %s\n", $mysqli->error); }

ou via estilo de procedimento mysqli_set_charset($db,"utf8")

0
dmitry_podyachev