Atualmente, estamos usando os seguintes comandos no PHP para definir o conjunto de caracteres para UTF-8 em nosso aplicativo.
Como isso é um pouco trabalhoso, gostaríamos de definir isso como a configuração padrão no MySQL. Podemos fazer isso em /etc/my.cnf ou em outro local?
SET NAMES 'utf8'
SET CHARACTER SET utf8
Procurei um conjunto de caracteres padrão no /etc/my.cnf, mas não há nada sobre os conjuntos de caracteres.
Nesse ponto, fiz o seguinte para definir as variáveis de conjunto de caracteres e agrupamento do MySQL como UTF-8:
skip-character-set-client-handshake
character_set_client=utf8
character_set_server=utf8
Essa é a maneira correta de lidar com isso?
mysql
character-encoding
Jorre
fonte
fonte
utf8mb4
, ou seja, UTF-8 real com suporte completo a Unicode. Veja Como suportar Unicode completo nos bancos de dados MySQL .utf8mb4
isso seja um tipo de precedente perigoso?Respostas:
Para definir o padrão como UTF-8, você deseja adicionar o seguinte ao my.cnf
Se você deseja alterar o conjunto de caracteres de um banco de dados existente, informe-me ... sua pergunta não o especificou diretamente, portanto, não tenho certeza se é isso que você deseja fazer.
fonte
Table
CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;[mysqld]
.utf8
caracteres do MySQL . Use emutf8mb4
vez disso.Para a versão recente do MySQL,
causa um problema. É obsoleto, eu acho.
Como Justin Ball diz em " Atualize para o MySQL 5.5.12 e agora o MySQL não inicia , você deve:
Remova essa diretiva e você deve ser bom.
Então seu arquivo de configuração ('/etc/my.cnf', por exemplo) deve ficar assim:
Reinicie o MySQL.
Para garantir que seu MySQL seja UTF-8, execute as seguintes consultas no prompt do MySQL:
Primeira consulta:
A saída deve se parecer com:
Segunda consulta:
E a saída da consulta é:
fonte
character_set_filesystem | utf8
. Eu não tenho certeza, está tudo bem?mysql Ver 15.1 Distrib 5.5.35-MariaDB, for debian-linux-gnu (x86_64) using readline 5.1
default-character-set
lo. Em vez disso, pode mudar paraloose-default-character-set = utf8
- ou seja, prefixo com 'loose-'. Isso ficamysqlbinlog
feliz, se você precisar usá-lo - google for: mysqlbinlog "loose-default-character-set" .init-connect='SET NAMES utf8'
realmente necessário? Caso contrário, podemos definitivamente fazer isso sem desempenho.Essa pergunta já tem muitas respostas, mas Mathias Bynens mencionou que 'utf8mb4' deve ser usado em vez de 'utf8' para ter um melhor suporte UTF-8 ('utf8' não suporta caracteres de 4 bytes, os campos são truncados na inserção ) Considero isso uma diferença importante. Então, aqui está mais uma resposta sobre como definir o conjunto de caracteres padrão e agrupamento. Um que lhe permitirá inserir uma pilha de cocô (💩).
Isso funciona no MySQL 5.5.35.
Observe que algumas das configurações podem ser opcionais. Como não tenho certeza absoluta de que não esqueci nada, tornarei esta resposta um wiki da comunidade.
Configurações antigas
Config
Novas configurações
character_set_system é sempre utf8 .
Isso não afetará as tabelas existentes, é apenas a configuração padrão (usada para novas tabelas). O seguinte código ALTER pode ser usado para converter uma tabela existente (sem a solução alternativa de restauração de despejo):
Editar:
Em um servidor MySQL 5.0: character_set_client, character_set_connection, character_set_results, collation_connection permanecem em latin1. A emissão
SET NAMES utf8
(utf8mb4 não disponível nessa versão) também os define como utf8.Advertência : Se você tinha uma tabela utf8 com uma coluna de índice do tipo VARCHAR (255), ela não pode ser convertida em alguns casos, porque o comprimento máximo da chave foi excedido (
Specified key was too long; max key length is 767 bytes.
). Se possível, reduza o tamanho da coluna de 255 para 191 (porque 191 * 4 = 764 <767 <192 * 4 = 768). Depois disso, a tabela pode ser convertida.fonte
character_set_database
ainda éutf8
ecollation_database
é utf8_bin`. Perdi alguma coisa?character-set-client-handshake = FALSE
a seção [mysqld], por isso sempre vai usar o padrão codificação, mesmo se você vai cometer erros na camada de aplicaçãoNo MySQL 5.5 eu tenho no my.cnf
O resultado é
fonte
skip-character-set-client-handshake
faz exatamente e em que circunstâncias é necessário?show variables like "%collation%";
eu estava vendo 'collation_connection' comoutf8_general_ci
e collation_database e collation_server comoutf8_unicode_ci
. A adição da linhaskip-character-set-client-handshake
alterou a entrada geral para unicode, para que todos os três fossem consistentes.skip-character-set-client-handshake
fizeram por mim (junto com o "conjunto de caracteres-servidor" e "servidor de agrupamento", é claro - no Debian 7). Osinit_connect
s não fizeram diferença com ou sem oskip
e parecem redundantes. +1 e obrigado.Nota: o arquivo my.cnf está localizado em
/etc/mysql/
Depois de adicionar estas linhas:
Não se esqueça de reiniciar o servidor:
fonte
O NijaCat estava próximo, mas o excesso especificado:
Para definir o padrão como UTF-8, você deseja adicionar o seguinte ao my.cnf
Em seguida, para verificar:
fonte
[mysql] default-character-set=utf8
então?[mysqld]
uso emcharacter-set-server
vez dedefault-character-set
Eu também descobri que depois de definir
default-character-set = utf8
sob[mysqld]
título, MySQL 5.5.x não iria começar sob Ubuntu 12.04 (Pangolin preciso).fonte
[mysqld]
, você deve usar emcharacter-set-server
vez dedefault-character-set
. (Extremamente confuso, eu concordo!)MySQL v5.5.3 e superior:
Apenas adicione três linhas apenas na seção [mysqld]:
Nota: Incluindo
skip-character-set-client-handshake
aqui elimina a necessidade de incluirinit-connect
no[mysqld]
edefault-character-set
nos[client]
e[mysql]
seções.fonte
No Xubuntu 12.04, simplesmente adicionei
para /etc/mysql/my.cnf
E o resultado é
Veja também http://dev.mysql.com/doc/refman/5.6/en/charset-server.html
fonte
Todas as configurações listadas aqui estão corretas, mas aqui está a solução mais ideal e suficiente:
Adicione-os a
/etc/mysql/my.cnf
.Observe que escolho o tipo de agrupamento utf8_unicode_ci devido ao problema de desempenho.
O resultado é:
E é aí que você se conecta como usuário não SUPER !
Por exemplo, a diferença entre a conexão como usuário SUPER e não-SUPER (é claro no caso de agrupamento utf8_unicode_ci ):
usuário com SUPER priv .:
usuário com priv não SUPER :
Eu escrevi um artigo abrangente (rus) explicando em detalhes por que você deve usar uma ou outra opção. Todos os tipos de conjuntos de caracteres e agrupamentos são considerados: para servidor, para banco de dados, para conexão, para tabela e até para coluna.
Espero que isso e o artigo ajudem a esclarecer momentos pouco claros.
fonte
utf8_unicode_ci
devido a problemas de desempenho; por que não usarutf8_bin
?utf8_unicode_ci
. Nunca gastei tempo testando o desempenho.A diretiva foi alterada para
character-set-system=utf8
http://dev.mysql.com/doc/refman/5.6/en/charset-configuration.html
fonte
Versões do MySQL e distribuições do Linux podem ser importantes ao fazer configurações.
No entanto, as alterações na
[mysqld]
seção são incentivadas.Quero dar uma breve explicação da resposta de tomazzlender:
[mysqld]
Isso mudará collation_connection para utf8_unicode_ci
Usando
SET NAMES
:O SET NAMES influenciará três caracteres, ou seja:
Isso definirá
character_set_database & character_set_server
Isso afetará apenas collation_database & collation_server
Desculpe, não tenho tanta certeza do que é isso. Eu não o uso no entanto:
fonte
character_set_server
não deve ser definido manualmente.character set
ao estabelecer conexão com o banco de dados, no entanto, parece um pouco irritante.character_set_server
na[mysqld]
seção afetarácharacter_set_database
echaracter_set_server
. Agora, acho que uma boa prática é apontar explicitamente ocharacter set
que você deseja usar ao criar um banco de dados, uma tabela e uma conexão com o banco de dados. Honestamente falando, a documentação demysql
não é tão fácil de entender. Você sabe se existe uma maneira genérica de obter todas as configuraçõescharacter set
ecollation
feitas no mysql?No Fedora 21
Adicionar seguir:
Salvar e sair.
Final lembre-se de reiniciar o serviço mysqld com
service mysqld restart
.fonte
MySQL 5.5, tudo que você precisa é:
collation_server
é opcional.fonte
Se você está tendo problemas para confirmar o suporte ao conjunto de caracteres do cliente usando o MySQL Workbench, lembre-se da seguinte nota:
Importante Todas as conexões abertas pelo MySQL Workbench automaticamente definem o conjunto de caracteres do cliente como utf8. Alterar manualmente o conjunto de caracteres do cliente, como usar SET NAMES ..., pode fazer com que o MySQL Workbench não exiba corretamente os caracteres. Para obter informações adicionais sobre conjuntos de caracteres do cliente, consulte Conjuntos de caracteres de conexão e agrupamentos.
Portanto, não consegui substituir os conjuntos de caracteres do MySQL Workbench pelas alterações my.cnf. por exemplo, 'definir nomes utf8mb4'
fonte
Se você está confuso com sua configuração para client e conn é redefinida após reiniciar o serviço mysql. Tente estas etapas (que funcionaram para mim):
vi /etc/my.cnf
:wq [client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
status;
, você encontrará o conjunto de caracteres para 'client' e 'conn' está definido como 'utf8'.Verifique a referência para mais informações.
fonte
Você pode fazê-lo da maneira que funciona, e se não funcionar, você precisará reiniciar o mysql.
fonte
Mude o caractere do MySQL:
Cliente
mysqld
Não devemos escrever
default-character-set=utf8
no mysqld, porque isso pode resultar em um erro como:Finalmente:
fonte