it-swarm.dev

Como fazer o MySQL manipular o UTF-8 corretamente

Uma das respostas para uma pergunta que fiz ontem sugeri que eu deveria ter certeza de que meu banco de dados poderia manipular os caracteres UTF-8 corretamente. Como eu posso fazer isso com o MySQL?

84
Ben

Update: 

Resposta curta - Você deve estar quase sempre usando o conjunto de caracteres utf8mb4 e o agrupamento utf8mb4_unicode_ci.

Para alterar o banco de dados:

ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Vejo: 

Resposta Original:

O MySQL 4.1 e acima tem um conjunto de caracteres padrão de UTF-8. Você pode verificar isso em seu arquivo my.cnf, lembre-se de definir both client e server (default-character-set e character-set-server).

Se você tiver dados que deseja converter em UTF-8, descarregue seu banco de dados e importe-o de volta como UTF-8, certificando-se:

  • use SET NAMES utf8 antes de consultar/inserir no banco de dados
  • use DEFAULT CHARSET=utf8 ao criar novas tabelas
  • nesse ponto, seu cliente e servidor MySQL devem estar em UTF-8 (consulte my.cnf). Lembre-se de que qualquer idioma que você usa (como o PHP) deve ser UTF-8 também. Algumas versões do PHP usarão sua própria biblioteca cliente MySQL, que pode não estar ciente do UTF-8.

Se você quiser migrar os dados existentes, lembre-se de fazer o backup primeiro! Muitos cortes estranhos de dados podem acontecer quando as coisas não saem como planejado!

Alguns recursos:

71
Owen

Para tornar isso 'permanente', em my.cnf:

[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8

Para verificar, vá ao cliente e mostre algumas variáveis:

SHOW VARIABLES LIKE 'character_set%';

Verifique se eles são todos utf8, exceto ..._filesystem, que deve ser binary e ..._dir, que apontam para algum lugar na instalação do MySQL.

38
Javier

O MySQL 4.1 e superior tem um conjunto de caracteres padrão que chama utf8, mas que na verdade é apenas um subconjunto de UTF-8 (permite apenas caracteres de três bytes e menores).

Use utf8mb4 como seu charset se você quiser "full" UTF-8.

30
T.W.R. Cole

A resposta curta: Use utf8mb4 em 4 lugares:

  • Os bytes no seu cliente são utf8, não latin1/cp1251/etc.
  • SET NAMES utf8mb4 ou algo equivalente ao estabelecer a conexão do cliente com o MySQL
  • CHARACTER SET utf8mb4 em todas as tabelas/colunas - exceto as colunas que são estritamente ascii/hex/country_code/Zip_code/etc.
  • <meta charset charset=UTF-8> se você estiver enviando para HTML. (Sim, a ortografia é diferente aqui.)

Mais informações ;
UTF8 todo o caminho

Os links acima fornecem a "resposta canônica detalhada é necessária para resolver todas as preocupações". - Existe um limite de espaço neste fórum.

Editar

Além de CHARACTER SET utf8mb4 contendo "todos" os caracteres do mundo, COLLATION utf8mb4_unicode_520_ci é discutível como o melhor agrupamento para uso geral. (Há também turcos, espanhóis, etc, agrupamentos para aqueles que querem as nuances nessas línguas.)

19
Rick James

O conjunto de caracteres é uma propriedade do banco de dados (padrão) e da tabela. Você pode dar uma olhada (comandos do MySQL):

show create database foo; 
> CREATE DATABASE  `foo`.`foo` /*!40100 DEFAULT CHARACTER SET latin1 */

show create table foo.bar;
> lots of stuff ending with
> ) ENGINE=InnoDB AUTO_INCREMENT=252 DEFAULT CHARSET=latin1

Em outras palavras; É muito fácil verificar o conjunto de caracteres do banco de dados ou alterá-lo:

ALTER TABLE `foo`.`bar` CHARACTER SET utf8;
4
extraneon

Para alterar a codificação do conjunto de caracteres para UTF-8 para o próprio banco de dados, digite o seguinte comando no mysql> Prompt. USE ALTER DATABASE .. Substitua DBNAME pelo nome do banco de dados:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

Esta é uma duplicata desta questão Como converter um conjunto de caracteres e um agrupamento de banco de dados MySQL inteiros em UTF-8?

2
Nyein Aung

Eu segui a solução do Javier, mas adicionei algumas linhas diferentes no my.cnf:

[myslqd]
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8 

Eu encontrei esta idéia aqui: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html no primeiro/único comentário do usuário na parte inferior da página. Ele menciona que skip-character-set-client-handshake tem alguma importância.

1
Vlad Balan

Defina seu database collation para UTF-8 E aplique table collation ao banco de dados padrão.

0
Gaurav Lad

Essas dicas sobre MySQL e UTF-8 podem ser úteis. Infelizmente, eles não constituem uma solução completa, apenas dicas comuns.

0
Edward Z. Yang