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_schema
y 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.opt
que 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 utf8
pero algunos de ellos latin1
?
Esto dependería de la versión del sistema operativo de MySQL Binary. Las versiones de Windows pueden tener latin1
mientras que las versiones de Linux pueden usar utf8
.