¿Por qué character_set_server predeterminado es latin1?

12

Estoy usando MySQL 5.5 y cuando muestro variables sobre charset, tengo

+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+

¿Debo cambiar el character_set_databasey character_set_serverpara utf8?

Yoga
fuente

Respuestas:

8

Piénsalo:

  • Está almacenando datos en la base de datos como latin1
  • Sus datos son manejados internamente por mysqld como latin1

Si los datos provienen del sistema operativo o de la conexión utf8, ¿cómo lo tratará mysqld?

En lugar de adivinar o esperar lo mejor, puede cambiar el comportamiento del juego de caracteres entrante. Con la excepción de information_schemay mysql, tome todas sus bases de datos y establezca el conjunto de caracteres predeterminado en utf8:

ALTER DATABASE dbname CHARACTER SET utf8;

Si tiene una recopilación específica que la acompañe, haga esto:

ALTER DATABASE dbname COLLATE 'utf8_general_ci';

Aquí están las colaciones para elegir:

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)

También podrías correr

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 el conjunto de caracteres individual de una base de datos, ejecute esto:

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>

En cuanto a la configuración, puedes probar esto:

Agregue las líneas a my.cnf

[mysqld]
character_set_database=utf8
character_set_server=utf8

luego reinicie mysql

Lo discutí el 1 de agosto de 2011: codificación del conjunto de caracteres en una tabla

CAVEAT (para servidores de base de datos MySQL en Windows)

Estos comandos

ALTER DATABASE dbname CHARACTER SET utf8;
ALTER DATABASE dbname COLLATE 'utf8_general_ci';

no funciona en la versión de Windows de MySQL debido a la forma en que Windows bloquea los archivos. Se llama al archivo necesario db.optque se encuentra en la subcarpeta de la base de datos en datadir.

Puede que tenga que hacer lo siguiente:

  • mysqldump esa base de datos (no hay información de creación de base de datos, solo creación de tablas e INSERTOS)
  • soltar esa base de datos
  • crear una base de datos con el conjunto de caracteres y la clasificación específicos
  • recargar en el basurero

EPÍLOGO

No importa lo que haga, realice los cambios en un servidor de desarrollo / preparación para ver si obtiene los efectos deseados.

ACTUALIZACIÓN 2012-12-05 11:00 EDT

Tus preguntas

¿Realmente debería cambiarlo?

Para garantizar el tratamiento adecuado de los datos, es posible que desee asegurarse de tener manzanas con manzanas. Los datos preparados como un conjunto de caracteres y cargándolos en una tabla con la base de datos posiblemente alineando los datos como si ve que otro conjunto de caracteres probablemente no muestre los datos con el conjunto de caracteres que mysqld ve cuando se recupera y se envía de nuevo a una conexión DB. Intente cargar la base de datos en un servidor Dev / Staging y experimente con la configuración de conjuntos de caracteres predeterminados.

¿Por qué se usan algunos valores predeterminados utf8pero algunos de ellos latin1?

Esto dependería de la versión del sistema operativo de MySQL Binary. Las versiones de Windows pueden tener latin1mientras que las versiones de Linux pueden usar utf8.

RolandoMySQLDBA
fuente
Hola, gracias por tu respuesta detallada. En realidad, mis preguntas no son sobre cómo cambiarlo, sino ... 1. ¿Realmente debería cambiarlo? 2. ¿Por qué algunos valores predeterminados usan utf8 pero otros usan latin1?
Yoga
1
(gracias de nuevo primero) Esto dependería de la versión del sistema operativo de MySQL Binary. <- Quiero decir, cuando estoy en Ubuntu, por qué el valor predeterminado se mezcla latin1y utf8, por ejemplo, character_set_connectiones utf8 pero character_set_databasees latin1
Yoga
1
@Rolando [mysqld] character_set_database=utf8 character_set_server=utf8no funciona.
Jorge B.
Todavía no lo entiendo ... incluso si el sistema operativo host utiliza un conjunto de caracteres limitado y tonto, ¿no debería la base de datos almacenar por defecto el texto en un conjunto de caracteres que pueda representar cualquier carácter, incluso si acepta la entrada latin1y tiene que convertirlo? ¿para almacenamiento?
Andy