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

UTF-8 até o fim


Armazenamento de dados :

  • Especifique o utf8mb4 conjunto de caracteres em todas as tabelas e colunas de texto em seu banco de dados. Isso faz com que o MySQL armazene fisicamente e recupere valores codificados nativamente em UTF-8. Observe que o MySQL usará implicitamente utf8mb4 codificação se um utf8mb4_* agrupamento é especificado (sem qualquer conjunto de caracteres explícito).

  • Nas versões mais antigas do MySQL (<5.5.3), infelizmente você será forçado a usar simplesmente utf8 , que oferece suporte apenas a um subconjunto de caracteres Unicode. Eu gostaria de estar brincando.

Acesso a dados :

  • No código do seu aplicativo (por exemplo, PHP), em qualquer método de acesso ao banco de dados usado, você precisará definir o conjunto de caracteres de conexão para utf8mb4 . Dessa forma, o MySQL não faz conversão de seu UTF-8 nativo quando transfere dados para seu aplicativo e vice-versa.

  • Alguns drivers fornecem seu próprio mecanismo para configurar o conjunto de caracteres de conexão, que atualiza seu próprio estado interno e informa ao MySQL sobre a codificação a ser usada na conexão—esta é geralmente a abordagem preferida. Em PHP:

    • Se você estiver usando o PDO camada de abstração com PHP ≥ 5.3.6, você pode especificar charset no DSN :
       $dbh = new PDO('mysql:charset=utf8mb4');
      

    • Se você estiver usando o mysqli , você pode chamar set_charset() :
        $mysqli->set_charset('utf8mb4');       // object oriented style
        mysqli_set_charset($link, 'utf8mb4');  // procedural style
      

    • Se você está preso com o mysql simples mas por acaso estiver executando o PHP ≥ 5.2.3, você pode chamar mysql_set_charset .

  • Se o driver não fornecer seu próprio mecanismo para definir o conjunto de caracteres de conexão, você pode ter que emitir uma consulta para informar ao MySQL como seu aplicativo espera que os dados na conexão sejam codificados:SET NAMES 'utf8mb4' .

  • A mesma consideração em relação a utf8mb4 /utf8 aplica-se como acima.

Saída :

  • Caso seu aplicativo transmita texto para outros sistemas, eles também precisarão ser informados sobre a codificação de caracteres. Com aplicativos da web, o navegador deve ser informado sobre a codificação em que os dados são enviados (através de cabeçalhos de resposta HTTP ou metadados HTML ).

  • Em PHP, você pode usar o default_charset php.ini ou emita manualmente o Content-Type cabeçalho MIME, o que é apenas mais trabalho, mas tem o mesmo efeito.

  • Ao codificar a saída usando json_encode() , adicione JSON_UNESCAPED_UNICODE como segundo parâmetro.

Entrada :

  • Infelizmente, você deve verificar cada string recebida como sendo UTF-8 válida antes de tentar armazená-la ou usá-la em qualquer lugar. mb_check_encoding() do PHP faz o truque, mas você tem que usá-lo religiosamente. Não há realmente nenhuma maneira de contornar isso, pois clientes maliciosos podem enviar dados em qualquer codificação que quiserem, e não encontrei um truque para fazer com que o PHP faça isso para você de forma confiável.

  • Da minha leitura da atual especificação HTML , os seguintes sub-balas não são mais necessários ou mesmo válidos para HTML moderno. Meu entendimento é que os navegadores trabalharão e enviarão dados no conjunto de caracteres especificado para o documento. No entanto, se você estiver segmentando versões mais antigas do HTML (XHTML, HTML4 etc.), esses pontos ainda podem ser úteis:
    • Somente para HTML antes de HTML5 :você deseja que todos os dados enviados a você pelos navegadores estejam em UTF-8. Infelizmente, se você for pela única maneira confiável de fazer isso é adicionar o accept-charset atribua a todos os seus
      tags: .
    • Somente para HTML antes de HTML5 :observe que a especificação HTML do W3C diz que os clientes "devem" enviar formulários de volta ao servidor em qualquer conjunto de caracteres que o servidor serviu, mas isso aparentemente é apenas uma recomendação, daí a necessidade de ser explícito em cada etiqueta.

Outras Considerações sobre o Código :

  • Obviamente, todos os arquivos que você servirá (PHP, HTML, JavaScript, etc.) devem ser codificados em UTF-8 válido.

  • Você precisa ter certeza de que toda vez que processar uma string UTF-8, você o faça com segurança. Esta é, infelizmente, a parte difícil. Você provavelmente desejará fazer uso extensivo do mbstring extensão.

  • As operações de string integradas do PHP não por padrão, seguro UTF-8. Existem algumas coisas que você pode fazer com segurança com operações normais de string PHP (como concatenação), mas para a maioria das coisas você deve usar o equivalente mbstring função.

  • Para saber o que você está fazendo (leia:não estrague tudo), você realmente precisa saber o UTF-8 e como ele funciona no nível mais baixo possível. Confira qualquer um dos links de utf8.com para alguns bons recursos para aprender tudo o que você precisa saber.