Como fazer alça MySQL UTF-8 corretamente
Pergunta
Uma das respostas a uma pergunta que fiz ontem sugeriu que eu deveria certificar-se de meu banco de dados pode lidar com caracteres UTF-8 corretamente. Como posso fazer isso com o MySQL?
Solução
Update:
A resposta curta -. Você deve quase sempre estar usando o charset utf8mb4
e utf8mb4_unicode_ci
agrupamento
Para alter database:
ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Veja:
-
O comentário de Aaron sobre esta resposta como fazer alça MySQL UTF-8 corretamente
-
guia Conversão: https: // dev.mysql.com/doc/refman/5.5/en/charset-unicode-conversion.html
Resposta Original:
MySQL 4.1 e acima tem um conjunto de caracteres padrão de UTF-8. Você pode verificar isso no seu arquivo my.cnf
, lembre-se de conjunto de ambos cliente e servidor (default-character-set
e character-set-server
).
Se você tiver dados existentes que você deseja converter para UTF-8, despejar o seu banco de dados e importá-lo de volta como UTF-8 certificando-se:
- uso
SET NAMES utf8
antes de consulta / insert no banco de dados - uso
DEFAULT CHARSET=utf8
ao criar novas tabelas - neste momento seu cliente MySQL eo servidor deve estar em UTF-8 (ver
my.cnf
). lembre-se qualquer linguagem que você usa (como PHP) deve ser UTF-8 também. Algumas versões do PHP irá usar a sua própria biblioteca de cliente MySQL, que pode não ser UTF-8 consciente.
Se você deseja migrar os dados existentes lembre-se de fazer backup primeiro! Muita choping estranha de dados pode acontecer quando as coisas não saem como planejado!
Alguns recursos:
- completa UTF-8 migração (cdbaby.com)
- UTF-8 prontidão das funções php (note alguma desta informações está desatualizado)
Outras dicas
Para fazer este 'permanente', em my.cnf
:
[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8
Para verificar, vá para o cliente e mostrar algumas variáveis:
SHOW VARIABLES LIKE 'character_set%';
Verifique se eles estão todos utf8
, exceto ..._filesystem
, que deve ser binary
e ..._dir
, que aponta em algum lugar na instalação do MySQL.
MySQL 4.1 e acima tem um conjunto de caracteres padrão que chama utf8
mas que na verdade é apenas um subconjunto de UTF-8 (permite apenas três bytes caracteres e menores).
Use utf8mb4
como seu charset se você quiser "full" UTF-8.
A resposta curta: Use utf8mb4
em 4 locais:
- Os bytes de seu cliente são utf8, não latin1 / CP1251 / etc.
-
SET NAMES utf8mb4
ou algo equivalente ao estabelecer a conexão do cliente para MySQL -
CHARACTER SET utf8mb4
em todas as tabelas / colunas -., Exceto colunas que são estritamente ascii / hex / contry_code / Zip_Code / etc -
<meta charset charset=UTF-8>
se você estiver saída 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". -. Há um limite de espaço neste fórum
Editar
Além de CHARACTER SET utf8mb4
contendo caracteres "todos" do mundo, COLLATION utf8mb4_unicode_520_ci
é discutível o 'melhor all-around' agrupamento para uso. (Há também turco, espanhol, etc, agrupamentos para aqueles que querem as nuances nesses idiomas.)
O charset é uma propriedade do banco de dados (padrão) e a mesa. Você pode ter um olhar (MySQL comandos):
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 para verificar o seu charset banco de dados ou alterá-lo:
ALTER TABLE `foo`.`bar` CHARACTER SET utf8;
Para alterar o conjunto de caracteres codificação para UTF-8 para o próprio banco de dados, digite o seguinte comando no mysql> prompt. ALTER DATABASE
USO .. Substituir DBNAME com o nome do banco de dados:
ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
Esta é uma duplicata de esta questão Como converter um conjunto de caracteres de banco de dados MySQL inteiro e agrupamento para UTF-8?
I seguido solução de Javier, mas adicionou algumas linhas diferentes em my.cnf:
[myslqd]
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8
Eu achei essa ideia aqui: http: // desenv. mysql.com/doc/refman/5.0/en/charset-server.html na primeira único comentário / usuário na parte inferior da página. Ele menciona que skip-character-set-client-aperto tem alguma importância.
dicas sobre MySQL e UTF-8 pode ser útil . Infelizmente, eles não constituem uma solução completa, gotchas apenas comuns.
Defina o seu database collation
para UTF-8
em seguida, aplicar table collation
para o padrão de banco de dados.
A sua resposta é que você pode configurar por Definições MySql. Na minha resposta pode ser algo saído do contexto, mas este é também saber é ajuda para você.
Como configurar Character Set
e Collation
.
Para aplicações que armazenam dados usando o conjunto de caracteres padrão do MySQL e agrupamento (
latin1, latin1_swedish_ci
), nenhuma configuração especial deve ser necessário. Se aplicações requerem armazenamento de dados usando um conjunto de caracteres diferente ou agrupamento, você pode configurar o conjunto de caracteres Informação várias maneiras:
- Especificar configurações de caracteres por banco de dados. Por exemplo, aplicações
esse banco de dados uso que se pode exigir
utf8
, que os pedidos que usar outro banco de dados pode exigir sjis. - Especificar configurações de caracteres na inicialização do servidor. Isto faz com que o servidor para utilizar as definições dadas para todas as aplicações que não fazem outra arranjos.
- Especificar configurações de caracteres em tempo de configuração , se você construir o MySQL a partir da fonte. Isso faz com que o servidor para utilizar as definições dadas para todos aplicações, sem ter que especificá-los na inicialização do servidor.
Os exemplos mostrados aqui para a sua pergunta para set conjunto de caracteres utf8, aqui também definir agrupamento para mais útil (collation` utf8_general_ci
).
Especificar configurações de caracteres por banco de dados
CREATE DATABASE new_db
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
Especificar configurações de caracteres no servidor de inicialização
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
Especificar configurações de caracteres em tempo de configuração do MySQL
shell> cmake . -DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
Para ver os valores do conjunto de caracteres e sistema de agrupamento variáveis ??que se aplicam a sua conexão, usar essas instruções:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
Isto pode ser a resposta longa, mas há toda forma, você pode usar. Esperançoso minha resposta é útil para você. Para mais informações http://dev.mysql.com/doc/ refman / 5,7 / en / charset-applications.html
SET NAMES UTF8
Esta é faz o truque
DATABASE LIGAÇÃO À UTF-8
$connect = mysql_connect('$localhost','$username','$password') or die(mysql_error());
mysql_set_charset('utf8',$connect);
mysql_select_db('$database_name','$connect') or die(mysql_error());
Definir sua conexão banco de dados para UTF8:
if($handle = @mysql_connect(DB_HOST, DB_USER, DB_PASS)){
//set to utf8 encoding
mysql_set_charset('utf8',$handle);
}
Foi capaz de encontrar uma solução. Publicou o seguinte, tal como especificado em http://technoguider.com/2015/ 05 / utf8-set up-in-mysql /
SET NAMES UTF8;
set collation_server = utf8_general_ci;
set default-character-set = utf8;
set init_connect = ’SET NAMES utf8′;
set character_set_server = utf8;
set character_set_client = utf8;