Uma das respostas a uma pergunta que fiz ontem sugeriu que eu deveria ter certeza de que meu banco de dados pode lidar com caracteres UTF-8 corretamente. Como posso fazer isso com o MySQL?
102
Uma das respostas a uma pergunta que fiz ontem sugeriu que eu deveria ter certeza de que meu banco de dados pode lidar com caracteres UTF-8 corretamente. Como posso fazer isso com o MySQL?
CHARACTER SETs
; 5.1.24 mexeu com o agrupamento do alemão sharp-s (ß), que foi retificado pela adição de outro agrupamento em 5.1.62 (possivelmente tornando as coisas piores); 5.5.3 preenchido utf8 com o novo charset utf8mb4.utf8
. Ele suporta apenas caracteres de até 3 bytes. O conjunto de caracteres correto que você deve usar no MySQL éutf8mb4
.Respostas:
Atualizar:
Resposta curta - você quase sempre deve usar o conjunto de
utf8mb4
caracteres e outf8mb4_unicode_ci
agrupamento.Para alterar o banco de dados:
Vejo:
Comentário de Aaron sobre esta resposta Como fazer o MySQL lidar com UTF-8 corretamente
Qual é a diferença entre utf8_general_ci e utf8_unicode_ci
Guia de conversão: https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-conversion.html
Resposta Original:
O MySQL 4.1 e superior tem um conjunto de caracteres padrão UTF-8. Você pode verificar isso em seu
my.cnf
arquivo, lembre-se de definir o cliente e o servidor (default-character-set
echaracter-set-server
).Se você tiver dados que deseja converter para UTF-8, descarte seu banco de dados e importe-o de volta como UTF-8 certificando-se de:
SET NAMES utf8
antes de consultar / inserir no banco de dadosDEFAULT CHARSET=utf8
ao criar novas tabelasmy.cnf
). lembre-se de que todas as linguagens que você usa (como PHP) também devem ser UTF-8. Algumas versões do PHP usarão sua própria biblioteca cliente MySQL, que pode não ser compatível com UTF-8.Se você deseja migrar os dados existentes, lembre-se de fazer o backup primeiro! Muitos dados estranhos podem acontecer quando as coisas não saem como planejado!
Alguns recursos:
fonte
utf8
no MySQL se refere apenas a um pequeno subconjunto do Unicode completo. Você deve usar emutf8mb4
vez disso para forçar o suporte total. Consulte mathiasbynens.be/notes/mysql-utf8mb4 "Por muito tempo, usei o conjunto de caracteres utf8 do MySQL para bancos de dados, tabelas e colunas, supondo que fosse mapeado para a codificação UTF-8 descrita acima."latin1
elatin1_swedish_ci
para o conjunto de caracteres e agrupamento padrão. Veja o "caráter Servidor Set e Agrupamento" página no manual do MySQL para confirmação: dev.mysql.com/doc/refman/5.1/en/charset-server.htmlutf8mb4
ocupar espaço extra quando a maior parte do texto é ASCII. Emborachar
strings sejam pré-alocadas,varchar
strings não são - veja as últimas linhas nesta página de documentação . Por exemplo,char(10)
será pessimisticamente reservar 40 bytes em utf8mb4, masvarchar(10)
irá alocar bytes de acordo com a codificação de comprimento variável.varchar(n)
para otext
tipo de dados se você tentar alterar umvarchar(n)
campo para um tamanho maior do que o byte viável (ao emitir um aviso). Um índice também terá um limite superior inferior de pior caso, e isso pode apresentar outros problemas.Para tornar isso 'permanente', em
my.cnf
:Para verificar, vá até o cliente e mostre algumas variáveis:
Verifique se eles são todos
utf8
, exceto o..._filesystem
que deve serbinary
e..._dir
, que aponta para algum lugar na instalação do MySQL.fonte
create table my_name(field_name varchar(25) character set utf8);
utf8
não é UTF-8 "completo".O MySQL 4.1 e superior tem um conjunto de caracteres padrão que ele 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 conjunto de caracteres se desejar UTF-8 "completo".fonte
utf8
não inclui caracteres como emoticons.utf8mb4
faz. Verifique isso para obter mais informações sobre como atualizar: mathiasbynens.be/notes/mysql-utf8mb4A resposta curta: Use
utf8mb4
em 4 lugares:SET NAMES utf8mb4
ou algo equivalente ao estabelecer a conexão do cliente ao MySQLCHARACTER SET utf8mb4
em todas as tabelas / colunas - exceto colunas estritamente ascii / hex / country_code / zip_code / etc.<meta charset charset=UTF-8>
se você estiver enviando para HTML. (Sim, a grafia é diferente aqui.)Mais informações ;
UTF8 até o fim
Os links acima fornecem a "resposta canônica detalhada necessária para resolver todas as questões". - Existe um limite de espaço neste fórum.
Editar
Além de
CHARACTER SET utf8mb4
conter "todos" os personagens do mundo,COLLATION utf8mb4_unicode_520_ci
é discutível o agrupamento "melhor versátil" para usar. (Existem também agrupamentos turco, espanhol, etc., para quem deseja as nuances nesses idiomas.)fonte
O conjunto de caracteres é uma propriedade do banco de dados (padrão) e da tabela. Você pode dar uma olhada (comandos MySQL):
Em outras palavras; é muito fácil verificar o conjunto de caracteres do seu banco de dados ou alterá-lo:
fonte
utf8
não é UTF-8 "completo".Para alterar a codificação do conjunto de caracteres para UTF-8 para o próprio banco de dados, digite o seguinte comando no prompt mysql>. USE
ALTER DATABASE
.. Substitua DBNAME pelo nome do banco de dados:Esta é uma duplicata desta questão. Como converter um conjunto de caracteres e agrupamento de banco de dados MySQL inteiro para UTF-8?
fonte
Segui a solução de Javier, mas adicionei algumas linhas diferentes em my.cnf:
Eu encontrei essa ideia 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 o handshake skip-character-set-client-client tem alguma importância.
fonte
skip-character-set-client-handshake
foi a chave.Essas dicas sobre MySQL e UTF-8 podem ser úteis. Infelizmente, eles não constituem uma solução completa, apenas pegadinhas comuns.
fonte
Defina seu
database collation
para, emUTF-8
seguida, apliquetable collation
ao padrão do banco de dados.fonte
Sua resposta é que você pode configurar por MySql Settings. Em Minha Resposta pode haver algo fora do contexto, mas isso também é uma ajuda para você.
como configurar
Character Set
eCollation
.utf8
, enquanto os aplicativos que usam outro banco de dados podem exigir sjis.Os exemplos mostrados aqui para sua pergunta definir conjunto de caracteres utf8, aqui também definir agrupamento para mais útil (
utf8_general_ci
agrupamento`).Especifique as configurações de caracteres por banco de dados
Especifique as configurações de caractere na inicialização do servidor
Especifique as configurações de caracteres no momento da configuração do MySQL
Para ver os valores do conjunto de caracteres e das variáveis do sistema de agrupamento que se aplicam à sua conexão, use estas instruções:
Esta pode ser uma resposta demorada, mas há todas as maneiras que você pode usar. Espero que minha resposta seja útil para você. para obter mais informações http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
fonte
SET NAMES UTF8
Isso resolve o problema
fonte
SET NAMES UTF8
(ouUTF8mb4
) esteja correto, você não explica o que ele faz (conjunto de caracteres usado para esta conexão). "Isso resolve" parece que resolveria o problema (fazer o MySQL lidar com UTF-8 corretamente), mas muitos bancos de dados MySQL são configurados para latin1 por padrão, de modo que não seria uma solução adequada. Eu mudaria o conjunto de caracteres padrão e os conjuntos de caracteres da tabela para utf8mb4. Realmente, esta resposta está um tanto incompleta, então eu votei contra ela.CONEXÃO DA BASE DE DADOS COM UTF-8
fonte
Defina sua conexão de banco de dados para UTF8:
fonte
mysql_*
interface obsoleta . Mude paramysqli_*
ouPDO
.Consegui encontrar uma solução. Executou o seguinte conforme especificado em http://technoguider.com/2015/05/utf8-set-up-in-mysql/
fonte
CHARACTER SET utf8
.root
não executará o mais importanteinit_connect
.