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_schemae 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.optlocalizado 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, utf8mas alguns usam padrão latin1?
Isso dependeria da versão do sistema operacional do MySQL Binary. As versões do Windows podem ter latin1enquanto as versões do Linux podem usar utf8.