Pense nisso:
- Você está armazenando dados no banco de dados como
latin1
- Seus dados são tratados internamente pelo mysqld como
latin1
Se os dados provenientes do sistema operacional ou da conexão são utf8
, como o mysqld vai tratá-los?
Em vez de adivinhar ou esperar o melhor, você pode alterar o comportamento do conjunto de caracteres recebidos. Com exceção de information_schema
e mysql
, pegue todos os seus bancos de dados e defina o conjunto de caracteres padrão para utf8
:
ALTER DATABASE dbname CHARACTER SET utf8;
Se você tiver uma coleção específica, faça o seguinte:
ALTER DATABASE dbname COLLATE 'utf8_general_ci';
Aqui estão os agrupamentos para escolher:
mysql> select * from information_schema.collations where CHARACTER_SET_NAME = 'utf8';
+--------------------+--------------------+-----+------------+-------------+---------+
| COLLATION_NAME | CHARACTER_SET_NAME | ID | IS_DEFAULT | IS_COMPILED | SORTLEN |
+--------------------+--------------------+-----+------------+-------------+---------+
| utf8_general_ci | utf8 | 33 | Yes | Yes | 1 |
| utf8_bin | utf8 | 83 | | Yes | 1 |
| utf8_unicode_ci | utf8 | 192 | | Yes | 8 |
| utf8_icelandic_ci | utf8 | 193 | | Yes | 8 |
| utf8_latvian_ci | utf8 | 194 | | Yes | 8 |
| utf8_romanian_ci | utf8 | 195 | | Yes | 8 |
| utf8_slovenian_ci | utf8 | 196 | | Yes | 8 |
| utf8_polish_ci | utf8 | 197 | | Yes | 8 |
| utf8_estonian_ci | utf8 | 198 | | Yes | 8 |
| utf8_spanish_ci | utf8 | 199 | | Yes | 8 |
| utf8_swedish_ci | utf8 | 200 | | Yes | 8 |
| utf8_turkish_ci | utf8 | 201 | | Yes | 8 |
| utf8_czech_ci | utf8 | 202 | | Yes | 8 |
| utf8_danish_ci | utf8 | 203 | | Yes | 8 |
| utf8_lithuanian_ci | utf8 | 204 | | Yes | 8 |
| utf8_slovak_ci | utf8 | 205 | | Yes | 8 |
| utf8_spanish2_ci | utf8 | 206 | | Yes | 8 |
| utf8_roman_ci | utf8 | 207 | | Yes | 8 |
| utf8_persian_ci | utf8 | 208 | | Yes | 8 |
| utf8_esperanto_ci | utf8 | 209 | | Yes | 8 |
| utf8_hungarian_ci | utf8 | 210 | | Yes | 8 |
| utf8_sinhala_ci | utf8 | 211 | | Yes | 8 |
+--------------------+--------------------+-----+------------+-------------+---------+
22 rows in set (0.03 sec)
Você também pode executar
mysql> show collation where charset='utf8';
+--------------------+---------+-----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+--------------------+---------+-----+---------+----------+---------+
| utf8_general_ci | utf8 | 33 | Yes | Yes | 1 |
| utf8_bin | utf8 | 83 | | Yes | 1 |
| utf8_unicode_ci | utf8 | 192 | | Yes | 8 |
| utf8_icelandic_ci | utf8 | 193 | | Yes | 8 |
| utf8_latvian_ci | utf8 | 194 | | Yes | 8 |
| utf8_romanian_ci | utf8 | 195 | | Yes | 8 |
| utf8_slovenian_ci | utf8 | 196 | | Yes | 8 |
| utf8_polish_ci | utf8 | 197 | | Yes | 8 |
| utf8_estonian_ci | utf8 | 198 | | Yes | 8 |
| utf8_spanish_ci | utf8 | 199 | | Yes | 8 |
| utf8_swedish_ci | utf8 | 200 | | Yes | 8 |
| utf8_turkish_ci | utf8 | 201 | | Yes | 8 |
| utf8_czech_ci | utf8 | 202 | | Yes | 8 |
| utf8_danish_ci | utf8 | 203 | | Yes | 8 |
| utf8_lithuanian_ci | utf8 | 204 | | Yes | 8 |
| utf8_slovak_ci | utf8 | 205 | | Yes | 8 |
| utf8_spanish2_ci | utf8 | 206 | | Yes | 8 |
| utf8_roman_ci | utf8 | 207 | | Yes | 8 |
| utf8_persian_ci | utf8 | 208 | | Yes | 8 |
| utf8_esperanto_ci | utf8 | 209 | | Yes | 8 |
| utf8_hungarian_ci | utf8 | 210 | | Yes | 8 |
| utf8_sinhala_ci | utf8 | 211 | | Yes | 8 |
+--------------------+---------+-----+---------+----------+---------+
22 rows in set (0.00 sec)
mysql>
Para ver o conjunto de caracteres individual de um banco de dados, execute o seguinte:
mysql> show create database sample;
+----------+-------------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------------+
| sample | CREATE DATABASE `sample` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
Quanto às configurações, você pode tentar o seguinte:
Adicione as linhas a my.cnf
[mysqld]
character_set_database=utf8
character_set_server=utf8
então reinicie o mysql
Eu discuti isso de volta em 01 de agosto de 2011: Codificação de conjunto de caracteres em uma tabela
CAVEAT (para servidores de banco de dados MySQL no Windows)
Esses comandos
ALTER DATABASE dbname CHARACTER SET utf8;
ALTER DATABASE dbname COLLATE 'utf8_general_ci';
não funciona na versão Windows do MySQL devido à maneira como o Windows bloqueia arquivos. O arquivo necessário é chamado, db.opt
localizado na subpasta do banco de dados em datadir
.
Você pode ter que fazer o seguinte:
- mysqldump que banco de dados (nenhum banco de dados cria informações, apenas criação de tabela e INSERTs)
- largue esse banco de dados
- criar banco de dados com o conjunto de caracteres e agrupamento específicos
- recarregar no despejo nele
EPÍLOGO
Não importa o que você faça, faça as alterações em um servidor de Dev / Staging para ver se você obtém os efeitos desejados
UPDATE 2012-12-05 11:00 EDT
Suas perguntas
Eu realmente deveria mudar isso?
Para garantir o tratamento adequado dos dados, convém verificar se você tem maçãs com maçãs. Os dados preparados como um conjunto de caracteres e carregando-os em uma tabela com o banco de dados possivelmente alinhando os dados como se visse outro conjunto de caracteres provavelmente não exibiriam os dados com o conjunto de caracteres que o mysqld vê quando recuperado e enviado de volta para uma conexão com o banco de dados. Tente carregar o banco de dados em um servidor de Dev / Staging e experimente definir os conjuntos de caracteres padrão.
Por que alguns padrões usam, utf8
mas alguns usam padrão latin1
?
Isso dependeria da versão do sistema operacional do MySQL Binary. As versões do Windows podem ter latin1
enquanto as versões do Linux podem usar utf8
.
latin1
eutf8
, por exemplo,character_set_connection
é utf8, mascharacter_set_database
é latin1[mysqld] character_set_database=utf8 character_set_server=utf8
não funciona.latin1
e precise convertê-lo para armazenamento?