utf8 cambiado a utf8mb4 tutorial de combate real

Prefacio:

En MySQL, el sistema admite muchos juegos de caracteres y existen ligeras diferencias entre los diferentes juegos de caracteres. En la actualidad, los conjuntos de caracteres más utilizados deberían ser utf8 y utf8mb4. En comparación con utf8, utf8mb4 admite el almacenamiento de expresiones emoji y tiene una gama más amplia de uso. Este artículo presentará cómo modificar utf8 al juego de caracteres utf8mb4.

1. Introducción al conjunto de caracteres utf8 y utf8mb4

Carácter (Carácter) es un término general para varios caracteres y símbolos, incluidos caracteres nacionales, signos de puntuación, símbolos gráficos, números, etc. Conjunto de caracteres (Conjunto de caracteres) es una colección de varios caracteres.

El juego de caracteres en MySQL puede actuar en cuatro niveles, a saber: nivel de servidor, nivel de base de datos, nivel de tabla y nivel de columna. Las reglas de comparación en el nivel del servidor están controladas por el parámetro character_set_server. Si el juego de caracteres no se especifica explícitamente al crear una base de datos, tabla o columna, se heredará el juego de caracteres del nivel anterior.

El conjunto de caracteres predeterminado de MySQL 5.7 y anteriores es latin1, y el conjunto de caracteres predeterminado de MySQL 8.0 es utf8mb4. Sin embargo, el uso de latin1 es fácil de provocar caracteres confusos, por lo que utf8 y utf8mb4 son los más utilizados. utf8 es en realidad un alias de utf8mb3, que utiliza solo de 1 a 3 bytes para representar caracteres. utf8mb4 usa de 1 a 4 bytes para representar caracteres y puede almacenar más expresiones emoji y cualquier carácter Unicode nuevo. utf8mb4 es compatible con utf8 y puede representar más caracteres que utf8, que es un superconjunto del conjunto de caracteres utf8. Así que ahora, algunas empresas nuevas sugieren establecer el conjunto de caracteres de la base de datos en utf8mb4, especialmente cuando se necesita almacenamiento de emoji.

2. Modificar el método del juego de caracteres

El negocio actual de Internet tiene cada vez más requisitos para el almacenamiento de emojis. Por ejemplo, los apodos, el contenido de los comentarios, etc. deben admitir emojis. En este momento, si el campo de la base de datos usa el conjunto de caracteres utf8, se informará el siguiente error:
java.sql.SQLException : Valor de cadena incorrecto: '\ xF0 \ x9F \ x92 \ x95 \ xF0 \ x9F ...' para la columna …………

Para las necesidades comerciales, debemos cambiar el juego de caracteres de la base de datos a utf8mb4. Afortunadamente, utf8mb4 es un superconjunto de utf8. No se requiere ninguna otra conversión excepto para cambiar la codificación a utf8mb4. Aquí hay una breve descripción del método de modificación.

Modificación de parámetros del sistema

Los parámetros del juego de caracteres del sistema deben modificarse primero, de modo que el juego de caracteres predeterminado de las tablas de la biblioteca creadas más tarde sea utf8mb4. Busque el archivo de configuración, agregue o modifique los siguientes parámetros:

vi /etc/my.cnf

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
skip-character-set-client-handshake
#忽略应用连接自己设置的字符编码,保持与全局设置一致
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4

Modificar el juego de caracteres de la base de datos

Para la base de datos creada, si el juego de caracteres utf8 original, puede modificarlo así:

# 设置数据库字符集编码
ALTER DATABASE `dbname` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

# 示例
mysql> show create database testdb;
+----------+-----------------------------------------------------------------+
| Database | Create Database                                                 |
+----------+-----------------------------------------------------------------+
| testdb   | CREATE DATABASE `testdb` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> alter database `testdb` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.01 sec)

mysql> show create database testdb;
+----------+--------------------------------------------------------------------+
| Database | Create Database                                                    |
+----------+--------------------------------------------------------------------+
| testdb   | CREATE DATABASE `testdb` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)

Modificar el juego de caracteres de la tabla y el campo

De manera similar, para una tabla que se ha creado, la modificación del juego de caracteres de la base de datos global y no afectará el juego de caracteres de la tabla y el campo originales. La tabla utf8 original se puede modificar de la siguiente manera:

# 修改表字符集
alter table `tb_name` default character set utf8mb4;

# 修改某字段字符集
alter table `tb_name` modify col_name varchar(20) character set utf8mb4;

# 同时修改表及字段字符集
alter table `tb_name` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

# 如果某个库里面表比较多 可以拼接出要执行的批量修改语句
SELECT
    CONCAT( 'ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;' ) 
FROM
    information_schema.`TABLES` 
WHERE
    TABLE_SCHEMA = 'testdb';

3. Algunas sugerencias

Parece que el método de modificación es bastante simple, pero hay que tener mucho cuidado en el entorno de producción. Especialmente cuando se modifica el conjunto de caracteres del campo, se bloqueará para evitar la operación de escritura. También es muy lento de ejecutar para tablas grandes, lo que puede afectar el negocio en línea.

Si su base de datos es relativamente pequeña, el método anterior no debería ser un gran problema. Para el entorno en línea, si desea modificar el juego de caracteres, debe hacer una evaluación, lo mejor es detener la modificación durante el período pico bajo del negocio y debe hacer una copia de seguridad antes de modificarlo. Si no hay tiempo de inactividad, puede considerar modificarlo en la base de datos en espera primero y luego cambiar entre activo y en espera, pero esto será más problemático.

Si es posible, también puede preparar una instancia vacía, importar primero la estructura de la tabla, cambiarla al juego de caracteres utf8mb4 y luego importar los datos. Este también es un método, pero también puede requerir apagado y conmutación.

Supongo que te gusta

Origin blog.51cto.com/10814168/2571966
Recomendado
Clasificación