Por que character_set_server padrão é latin1?

12

Estou usando o MySQL 5.5 e quando mostro variáveis ​​sobre o charset, tenho

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

Devo precisar alterar o character_set_databasee character_set_serverpara utf8?

Ioga
fonte

Respostas:

8

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.

RolandoMySQLDBA
fonte
Olá, obrigado pela sua resposta detalhada. Na verdade, minhas perguntas não são sobre como mudar isso, mas ... 1. Devo realmente mudar isso? 2. Por que alguns padrões usam utf8, mas outros usam latin1
Yoga
1
(obrigado novamente primeiro) Isso dependeria da versão do SO do binário do MySQL. <- eu quero dizer quando eu estou no Ubuntu, porque o padrão é misturado entre latin1e utf8, por exemplo, character_set_connectioné utf8, mas character_set_databaseé latin1
Yoga
1
@Rolando [mysqld] character_set_database=utf8 character_set_server=utf8não funciona.
Jorge B.
Ainda não entendi ... mesmo que o sistema operacional host use algum conjunto de caracteres limitado e tolo, o banco de dados não deve, por padrão, armazenar texto em um conjunto de caracteres que possa representar qualquer caractere, mesmo que aceite entrada latin1e precise convertê-lo para armazenamento?
Andy