En esta página se describe cómo actualizar el conjunto de caracteres y la ordenación de bases de datos de Cloud SQL.
Información general
Cuando creas una base de datos en Cloud SQL para MySQL, puedes especificar la configuración de juego de caracteres y ordenación de la base de datos. Si no especifica valores personalizados para estos ajustes, la base de datos usará el valor predeterminado. En MySQL, puedes especificar valores personalizados para el conjunto de caracteres y la ordenación en diferentes niveles de objetos, como bases de datos, tablas y columnas. Para obtener más información sobre cómo usar las configuraciones de conjuntos de caracteres y de intercalaciones en MySQL, consulta Conjuntos de caracteres, intercalaciones y Unicode.
Si quieres cambiar el conjunto de caracteres o la ordenación de tu base de datos después de haberla creado y de haber creado algunos objetos en ella, puedes hacerlo siguiendo el procedimiento que se describe en este documento.
Este procedimiento consta de los siguientes pasos:
- Comprueba los valores actuales del conjunto de caracteres y de la intercalación.
- Determina qué nivel de actualización quieres realizar.
- Crea una copia de seguridad de la instancia.
- Generar comandos de recompilación para objetos de base de datos almacenados.
- Actualiza tus bases de datos y, si es necesario, las tablas y las columnas.
- Valida las actualizaciones y busca errores.
- Vuelve a crear los objetos de base de datos almacenados.
- Crea otra copia de seguridad de la instancia.
Comprobar los valores actuales del conjunto de caracteres y de la intercalación
Comprueba los valores configurados para el conjunto de caracteres y la ordenación de tu base de datos y sus objetos. Cuando compruebes tu base de datos, también debes revisar la configuración de sus tablas, columnas y objetos almacenados. Puede usar las siguientes instrucciones para comprobar sus bases de datos y sus objetos.
Comprobar la configuración de la instancia
Para comprobar los valores globales predeterminados en el nivel de instancia (servidor), inicia un shell de MySQL e introduce el siguiente comando:
mysql> SELECT @@character_set_server,@@collation_server;
Ejemplo:
+------------------------+--------------------+
| @@character_set_server | @@collation_server |
+------------------------+--------------------+
| utf8mb4 | utf8mb4_0900_ai_ci |
+------------------------+--------------------+
1 row in set (0.00 sec)
Puedes comprobar que los valores globales predeterminados son diferentes de los valores personalizados que proporcionarás para tu base de datos más adelante.
Comprobar la configuración de la base de datos
Para comprobar los valores del conjunto de caracteres y de la ordenación a nivel de base de datos, utiliza la siguiente instrucción. Después de ejecutar cada instrucción, haz una lista de todas las bases de datos y los objetos de base de datos que tengas que actualizar con los nuevos conjuntos de caracteres o valores de orden. La lista depende de las bases de datos que quieras cambiar y del número de tablas, columnas y objetos de base de datos que requieran actualizaciones de configuración.
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE schema_name NOT IN ('performance_schema', 'mysql', 'sys', 'information_schema');
Por ejemplo, recibes el siguiente resultado:
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | DEFAULT_ENCRYPTION |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| def | test1 | utf8mb4 | utf8mb4_0900_ai_ci | NULL | NO |
| def | test2 | utf8mb4 | utf8mb4_0900_ai_ci | NULL | NO |
| def | test3 | utf8mb4 | utf8mb4_0900_ai_ci | NULL | NO |
| def | test4 | utf8mb4 | utf8mb4_0900_ai_ci | NULL | NO |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
Sin embargo, quieres cambiar las bases de datos a los siguientes valores de conjunto de caracteres personalizados:
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | DEFAULT_ENCRYPTION |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| def | test1 | ascii | ascii_general_ci | NULL | NO |
| def | test2 | latin1 | latin1_swedish_ci | NULL | NO |
| def | test3 | utf16 | utf16_general_ci | NULL | NO |
| def | test4 | ucs2 | ucs2_general_ci | NULL | NO |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
En este caso, para cada base de datos que tenga un valor que quiera cambiar, debe actualizar cada objeto que resida en la base de datos.
Comprobar la configuración de las tablas
Para comprobar los valores de las tablas, usa la siguiente instrucción:
SELECT T.table_name, T.table_schema, CCSA.character_set_name, CCSA.collation_name FROM information_schema.`tables` T, information_schema.`collation_character_set_applicability` CCSA WHERE CCSA.collation_name = T.table_collation AND T.table_schema NOT IN ('performance_schema', 'mysql', 'sys','information_schema');
Ejemplo:
+------------+--------------+--------------------+-------------------+
| TABLE_NAME | TABLE_SCHEMA | CHARACTER_SET_NAME | COLLATION_NAME |
+------------+--------------+--------------------+-------------------+
| t1 | test1 | ascii | ascii_general_ci |
| t2 | test2 | latin1 | latin1_swedish_ci |
| t3 | test3 | utf16 | utf16_general_ci |
| t4 | test4 | ucs2 | ucs2_general_ci |
+------------+--------------+--------------------+-------------------+
Comprobar la configuración de las columnas de la tabla
Para comprobar los valores de las columnas, usa la siguiente instrucción:
SELECT table_schema, table_name, column_name, character_set_name, collation_name FROM information_schema.columns WHERE table_schema NOT IN ('information_schema', 'performance_schema', 'sys', 'mysql');
Ejemplo:
+--------------+------------+-------------+--------------------+------------------+
| TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | CHARACTER_SET_NAME | COLLATION_NAME |
+--------------+------------+-------------+--------------------+------------------+
| test1 | t1 | c | ascii | ascii_general_ci |
| test1 | t1 | i | NULL | NULL |
| test2 | t2 | j | NULL | NULL |
| test2 | t2 | v | ascii | ascii_general_ci |
| test3 | t3 | k | NULL | NULL |
| test3 | t3 | summary | utf16 | utf16_general_ci |
| test4 | t4 | col | ucs2 | ucs2_general_ci |
| test4 | t4 | p | NULL | NULL |
+--------------+------------+-------------+--------------------+------------------+
Comprobar el esquema o la base de datos activos
Para consultar los detalles del esquema o la base de datos activos, usa la siguiente instrucción.
SELECT TABLE_SCHEMA, TABLE_NAME, CCSA.CHARACTER_SET_NAME AS DEFAULT_CHAR_SET, COLUMN_NAME, COLUMN_TYPE, C.CHARACTER_SET_NAME FROM information_schema.TABLES AS T JOIN information_schema.COLUMNS AS C USING (TABLE_SCHEMA, TABLE_NAME) JOIN information_schema.COLLATION_CHARACTER_SET_APPLICABILITY AS CCSA ON (T.TABLE_COLLATION = CCSA.COLLATION_NAME) WHERE TABLE_SCHEMA=SCHEMA() AND C.DATA_TYPE IN ('enum', 'varchar', 'char', 'text', 'mediumtext', 'longtext', 'set' ) ORDER BY TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME;
Ejemplo:
+------------+
| DATABASE() |
+------------+
| test3 |
+------------+
+--------------+------------+------------------+-------------+-------------+--------------------+
| TABLE_SCHEMA | TABLE_NAME | DEFAULT_CHAR_SET | COLUMN_NAME | COLUMN_TYPE | CHARACTER_SET_NAME |
+--------------+------------+------------------+-------------+-------------+--------------------+
| test3 | t3 | utf16 | summary | text | utf16 |
+--------------+------------+------------------+-------------+-------------+--------------------+
Comprobar la configuración de los procedimientos almacenados
Para comprobar los valores de los procedimientos almacenados, usa la siguiente instrucción:
SHOW PROCEDURE STATUS WHERE db = 'DB_NAME';
Sustituye DB_NAME por el nombre de la base de datos.
Ejemplo:
+-------+------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+-------+------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| test2 | p1 | PROCEDURE | root@% | 2024-08-09 11:47:05 | 2024-08-09 11:47:05 | DEFINER | | utf8mb4 | utf8mb4_0900_ai_ci | latin1_swedish_ci |
| test2 | p2 | PROCEDURE | root@% | 2024-08-09 11:48:36 | 2024-08-09 11:48:36 | DEFINER | | utf8mb4 | utf8mb4_0900_ai_ci | latin1_swedish_ci |
+-------+------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
Para obtener la definición de un procedimiento almacenado, usa la siguiente instrucción:
SHOW CREATE PROCEDURE DB_NAME.SP_NAME;
Haz los cambios siguientes:
- DB_NAME: el nombre de la base de datos MySQL
- SP_NAME: el nombre del procedimiento almacenado
Si un procedimiento almacenado no usa el conjunto de caracteres o el valor de intercalación que quieres, puede que tengas que eliminarlo y volver a crearlo con el nuevo conjunto de caracteres o intercalación.
Comprobar la asignación de la intercalación de la base de datos
En la salida del ejemplo anterior, el procedimiento almacenado se crea con latin1_swedish_ci
como la intercalación predeterminada y el conjunto de caracteres correspondiente es latin1
. Esto significa que todo el proceso se lleva a cabo con el conjunto de caracteres latin1
(a menos que se etiqueten parámetros específicos del procedimiento con un conjunto de caracteres personalizado). Si solo cambia el conjunto de caracteres y la ordenación a nivel de base de datos, la actualización a nivel de base de datos no actualizará el procedimiento almacenado automáticamente. El procedimiento sigue funcionando con el conjunto de caracteres latin1
y la intercalación correspondiente.
Al eliminar y volver a crear el procedimiento almacenado, se asegura de que este empiece a usar el nuevo conjunto de caracteres y la nueva intercalación de la base de datos que acaba de actualizar.
Para consultar la asignación entre la intercalación de la base de datos y el conjunto de caracteres, puedes
consultar la tabla information_schema.COLLATION_CHARACTER_SET_APPLICABILITY
.
Usa la siguiente declaración como ejemplo:
SELECT CHARACTER_SET_NAME
FROM information_schema.COLLATION_CHARACTER_SET_APPLICABILITY
WHERE COLLATION_NAME = (SELECT database_collation FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA = "test2" and ROUTINE_NAME = "p1");
Ejemplo:
+--------------------+
| CHARACTER_SET_NAME |
+--------------------+
| latin1 |
+--------------------+
Comprobar la configuración de los activadores
Para comprobar los valores de los activadores, usa la siguiente instrucción como ejemplo.
SHOW TRIGGERS FROM DB_NAME;
Sustituye DB_NAME por el nombre de la base de datos MySQL.
Para obtener la definición de un activador, usa la siguiente instrucción de ejemplo.
SHOW CREATE trigger DB_NAME.TRIGGER_NAME;
Haz los cambios siguientes:
- DB_NAME: el nombre de la base de datos MySQL
- TRIGGER_NAME: el nombre del activador
Si el activador no usa el conjunto de caracteres o el valor de orden que quieres, es posible que tengas que eliminarlo y volver a crearlo con el nuevo conjunto de caracteres o el nuevo orden. Comprueba que el activador esté usando la asignación de intercalación de la base de datos correcta. Para obtener más información sobre cómo comprobar la colación de la base de datos, consulta Comprobar la asignación de la colación de la base de datos.
Comprobar la configuración de los eventos
Para comprobar los valores de los eventos, usa la siguiente instrucción como ejemplo.
SHOW EVENTS FROM DB_NAME;
Sustituye DB_NAME por el nombre de la base de datos.
Para obtener la definición de un evento, usa la siguiente instrucción de ejemplo.
SHOW CREATE EVENT DB_NAME.EVENT_NAME;
Haz los cambios siguientes:
- DB_NAME: el nombre de la base de datos
- EVENT_NAME: el nombre del evento
Si el evento no usa el conjunto de caracteres o el valor de orden que quieres, puede que tengas que eliminarlo y volver a crearlo con el nuevo conjunto de caracteres o el nuevo orden. Comprueba que el evento use la asignación de intercalación de base de datos correcta. Para obtener más información sobre cómo comprobar la intercalación de la base de datos, consulta Comprobar la asignación de intercalación de la base de datos.
Comprobar la configuración de las funciones
Para comprobar los valores de las funciones, usa la siguiente instrucción como ejemplo.
SHOW FUNCTION STATUS WHERE db = 'DB_NAME';
Sustituye DB_NAME por el nombre de la base de datos.
Para obtener la definición de una función, usa la siguiente instrucción de ejemplo.
SHOW CREATE FUNCTION DB_NAME.FUNCTION_NAME;
Haz los cambios siguientes:
- DB_NAME: el nombre de la base de datos MySQL
- FUNCTION_NAME: el nombre de la función
Si la función no usa el conjunto de caracteres o el valor de orden que quieres, puede que tengas que eliminarla y volver a crearla con el nuevo conjunto de caracteres o el nuevo valor de orden. Comprueba que la función esté usando la asignación de intercalación de la base de datos correcta. Para obtener más información sobre cómo comprobar la colación de la base de datos, consulta el artículo Comprobar la asignación de colación de la base de datos.
Conjunto de caracteres o una ordenación. Comprueba que la función esté usando la asignación de intercalación de la base de datos correcta. Para obtener más información sobre cómo comprobar la colación de la base de datos, consulta el artículo Comprobar la asignación de colación de la base de datos.
Determinar el nivel de actualizaciones que se deben aplicar
Una vez que hayas comprobado la configuración del conjunto de caracteres y la ordenación de tu base de datos, tendrás una lista de bases de datos y, posiblemente, una lista de objetos de base de datos que tendrás que actualizar.
El número de tareas que tendrás que realizar depende del tipo de objetos de base de datos que requieran cambios en la configuración.
- Realizar actualizaciones a nivel de base de datos. Solo tienes que actualizar los metadatos de MySQL.
- Realizar actualizaciones a nivel de base de datos y de tabla. Solo tienes que actualizar los metadatos de MySQL.
- Realizar actualizaciones a nivel de base de datos, tabla y columna. Debe actualizar los metadatos y volver a crear las tablas y los objetos de la base de datos. Estas actualizaciones pueden llevar más tiempo, pero puedes usar una de las secuencias de comandos de ejemplo que se proporcionan para actualizar todas las tablas y columnas de una base de datos determinada.
Crear una copia de seguridad de la instancia
Antes de aplicar cualquiera de estas actualizaciones, crea una copia de seguridad de tu instancia. Para obtener más información, consulta Crear una copia de seguridad bajo demanda. Te recomendamos que hagas la copia de seguridad sin que se ejecute ninguna operación DDL en la instancia.
Generar comandos de recompilación para los objetos de base de datos almacenados en tu base de datos
Si necesitas eliminar y volver a crear objetos de base de datos almacenados en tus bases de datos con el nuevo conjunto de caracteres y la nueva ordenación, usa la herramienta mysqldump
para generar los comandos ahora. Después de actualizar las columnas de la base de datos y de la tabla, usará el archivo mysqldump
generado para volver a crear los objetos de la base de datos almacenados en su base de datos. Este comando genera instrucciones para todos los procedimientos almacenados, funciones, activadores y eventos.
Ejecuta el siguiente comando para poder usar el resultado y volver a crear todos los procedimientos, funciones y eventos almacenados de una base de datos concreta más adelante (cuando vuelvas a crear los objetos de la base de datos almacenados).
$ mysqldump -uDBAuser -p -h IP_ADDRESS \ -P 3306 DB_NAME --no-data --no-create-db \ --no-create-info --routines --triggers --events \ --set-gtid-purged=OFF --events > dump_objects.sql
Haz los cambios siguientes:
- IP_ADDRESS: dirección IP de la instancia de Cloud SQL para MySQL
- DB_NAME: el nombre de la base de datos MySQL
Actualiza tus bases de datos y, si es necesario, las tablas y las columnas.
En este paso, actualiza los valores del conjunto de caracteres y de la ordenación de tus bases de datos. Además, es posible que tengas que volver a crear tus tablas y columnas.
Realizar actualizaciones a nivel de base de datos
Si solo vas a realizar actualizaciones a nivel de base de datos, ejecuta la siguiente instrucción para actualizar tu base de datos:
ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Haz los cambios siguientes:
- DB_NAME: el nombre de la base de datos que se va a actualizar
- NEW_CHARSET: el nuevo conjunto de caracteres que se aplicará a la base de datos.
- NEW_COLLATION: la nueva ordenación que se aplicará a la base de datos.
Realizar actualizaciones a nivel de base de datos y de tabla
Si vas a realizar actualizaciones a nivel de base de datos y de tabla, haz lo siguiente:
Ejecuta la siguiente instrucción para actualizar tu base de datos:
ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Haz los cambios siguientes:
- DB_NAME: el nombre de la base de datos que se va a actualizar
- NEW_CHARSET: el nuevo conjunto de caracteres que se aplicará a la base de datos.
- NEW_COLLATION: la nueva ordenación que se aplicará a la base de datos.
Ejecuta la siguiente instrucción en cada tabla que quieras actualizar:
ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Haz los cambios siguientes:
- TABLE_NAME: el nombre de la tabla que se va a actualizar
- NEW_CHARSET: el nuevo conjunto de caracteres que se aplicará a la tabla.
- NEW_COLLATION: la nueva ordenación que se aplicará a la tabla.
Realizar actualizaciones a nivel de base de datos, tabla y columna
En este nivel, debe volver a codificar los datos para cumplir los nuevos ajustes de juego de caracteres y de orden. Si vas a actualizar una base de datos, una tabla o una columna, haz lo siguiente:
Antes de actualizar las columnas de la tabla, tenga en cuenta lo siguiente:
- La conversión del conjunto de caracteres y de la recopilación de datos
ALTER TABLE
provoca que la tabla se vuelva a compilar y la bloquea. Por lo tanto, se bloqueará cualquier consulta activa que intente acceder a la tabla. - La conversión del conjunto de caracteres
ALTER TABLE
y de la recopilación de datos lleva tiempo porque obtiene la tabla completa en la memoria. Esta operación puede aumentar la latencia de cualquier carga de trabajo que se ejecute en paralelo, ya que las páginas del grupo de búferes se utilizan para la tabla actualizada. - Si hay consultas que acceden a varias tablas y algunas de ellas se están actualizando mientras que otras aún no se han actualizado, es posible que las consultas produzcan resultados incoherentes durante el tiempo de esta transacción.
- El proceso de ejecutar una conversión de
ALTER TABLE
de conjunto de caracteres y de ordenación crea una tabla fantasma, por lo que debes planificar el uso del disco en consecuencia. - El conjunto de caracteres
ALTER TABLE
y la conversión de la recopilación de datos también provocan que se vuelvan a compilar los índices de la tabla. - No es necesario actualizar las instancias de réplica por separado. Los comandos
ALTER
,DROP
yCREATE
se replican automáticamente. Sin embargo, ejecutar comandos DDL puede provocar que el tiempo de retraso de la réplica aumente durante la operación. - Si restauras alguna de las bases de datos a partir de una copia de seguridad creada antes de aplicar estas actualizaciones, tendrás que volver a aplicar las actualizaciones.
- La conversión del conjunto de caracteres y de la recopilación de datos
Comprueba si hay tuplas de datos en tu tabla que puedan ser incompatibles con el nuevo conjunto de caracteres. Si hay alguna incompatibilidad, debes corregirla antes de actualizar el conjunto de caracteres. De lo contrario, se producirán errores durante el proceso de conversión. Puedes usar la siguiente
SELECT CONVERT
instrucción para validar tus datos con el nuevo conjunto de caracteres.SELECT COLUMN_NAME,CONVERT(COLUMN_NAME USING NEW_CHARSET) FROM TABLE_NAME WHERE COLUMN_NAME != CONVERT(COLUMN_NAME USING NEW_CHARSET);
SELECT c,CONVERT(c USING 'ascii') FROM t WHERE c != CONVERT(c USING ascii);
Ejemplo:
+------+--------------------------+ | c | convert(c using 'ascii') | +------+--------------------------+ | é | ? | | é | ? | | £ | ? | +------+--------------------------+
En este ejemplo, como la salida devuelve estas tres tuplas, hay tres valores incoherentes que deben corregirse. Antes de pasar al siguiente paso, examina el resultado de la consulta y corrige los datos hasta que la consulta devuelva cero tuplas en todas las columnas que necesiten conversión. También puedes combinar varias columnas en la misma consulta
SELECT
.Elige una opción para actualizar el conjunto de caracteres y la ordenación de tus tablas a nivel de columna.
Si quieres actualizar el conjunto de caracteres de una columna de una tabla muy específica, sigue los pasos de la pestaña "Nivel de columna", donde solo tienes que volver a codificar las columnas seleccionadas. De lo contrario, sigue los pasos de la pestaña Nivel de tabla para volver a codificar la tabla completa.
Nivel de tabla
Ejecuta la siguiente instrucción para actualizar tu base de datos:
ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Haz los cambios siguientes:
- DB_NAME: el nombre de la base de datos que se va a actualizar
- NEW_CHARSET: el nuevo conjunto de caracteres que se aplicará a la base de datos.
- NEW_COLLATION: la nueva ordenación que se aplicará a la base de datos.
En cada tabla afectada, ejecuta la siguiente instrucción para actualizarla:
ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Haz los cambios siguientes:
- TABLE_NAME: el nombre de la tabla que se va a actualizar
- NEW_CHARSET: el nuevo conjunto de caracteres que se aplicará a la tabla.
- NEW_COLLATION: la nueva ordenación que se aplicará a la tabla.
Actualizar a nivel de tabla para que todas las columnas que formen parte de la tabla se actualicen con el nuevo conjunto de caracteres y la nueva ordenación. Esta opción vuelve a crear la tabla por completo. Para usar esta opción, ejecuta la siguiente instrucción:
ALTER TABLE DB_NAME.TABLE_NAME CONVERT TO CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Haz los cambios siguientes:
- TABLE_NAME: el nombre de la tabla que se va a actualizar
- NEW_CHARSET: el nuevo conjunto de caracteres que se aplicará a la tabla.
- NEW_COLLATION: la nueva ordenación que se aplicará a la tabla.
A nivel de columna
Actualizar a nivel de columna. Esta opción también vuelve a crear la tabla por completo. Si se actualizan varias columnas, esta opción puede provocar que se vuelvan a compilar varias veces.
Para usar esta opción, ejecuta la siguiente instrucción:
- Ejecuta la siguiente instrucción para actualizar tu base de datos:
- DB_NAME: el nombre de la base de datos que se va a actualizar
- NEW_CHARSET: el nuevo conjunto de caracteres que se aplicará a la base de datos.
- NEW_COLLATION: la nueva ordenación que se aplicará a la base de datos.
- En cada tabla afectada, ejecuta la siguiente instrucción para actualizarla:
- TABLE_NAME: el nombre de la tabla que se va a actualizar
- NEW_CHARSET: el nuevo conjunto de caracteres que se aplicará a la tabla.
- NEW_COLLATION: la nueva ordenación que se aplicará a la tabla.
- Ejecuta la siguiente instrucción para actualizar los datos a nivel de columna:
- DB_NAME: el nombre de la base de datos que se va a actualizar
- TABLE_NAME: el nombre de la tabla que se va a actualizar
- COLUMN_DEFINITION: especifica una definición de columna exacta que incluye restricciones. La definición de la columna puede incluir los valores antiguos del conjunto de caracteres y de la intercalación. Debe actualizar la definición de la columna con los nuevos valores.
- NEW_CHARSET: el nuevo conjunto de caracteres que se aplicará a la columna de la tabla
- NEW_COLLATION: la nueva ordenación que se aplicará a la columna de la tabla
ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Haz los cambios siguientes:
ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Haz los cambios siguientes:
ALTER TABLE DB_NAME.TABLE_NAME MODIFY COLUMN_DEFINITION CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Haz los cambios siguientes:
Repite esta instrucción para todas las columnas de cadena de la tabla que necesiten una actualización del conjunto de caracteres o de la intercalación.
Validar las actualizaciones y buscar errores
Durante la operación ALTER TABLE
, busca errores que indiquen que los datos de la tabla no son compatibles con el nuevo conjunto de caracteres. Por ejemplo:
ERROR 1366 (HY000): Incorrect string value: '\xC3\xA9' for column 'c' at row 1
Si se produce algún error de compatibilidad de datos, te recomendamos que vuelvas a comprobar si hay errores de compatibilidad en tus tablas y que los corrijas antes de volver a ejecutar las instrucciones ALTER TABLE
para volver a codificar los datos.
Además, durante la operación ALTER TABLE
, las tablas (la tabla de claves externas y la tabla de referencia) pueden fallar en la comprobación de claves externas mientras se vuelve a codificar la columna. Si esto ocurre, puedes inhabilitar la comprobación de la clave externa (SET FOREIGN_KEY_CHECKS=0;
) y volver a ejecutar la actualización.
Volver a crear los objetos de base de datos almacenados
Una vez que hayas actualizado la base de datos correctamente, podrás usar el archivo mysqldump
generado para volver a crear los objetos de la base de datos almacenados con los valores de juego de caracteres y de ordenación.
Para volver a crear los objetos de base de datos almacenados, haz lo siguiente:
- Verifica que los objetos de la base de datos almacenados estén presentes en la base de datos.
- Asegúrate de que no haya ninguna carga paralela que espere que los objetos de la base de datos almacenados estén presentes durante este tiempo de eliminación y recreación.
El archivo
mysqldump
que has generado con la herramientamysqldump
no incluye la instrucción para eliminar los activadores. Si necesitas eliminar activadores, abre una terminal de MySQL para generar la instrucciónDROP
de los activadores.mysql> SELECT CONCAT('DROP TRIGGER ', TRIGGER_NAME, ';') AS drop_trigger_statements FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = DB_NAME;
Copia el resultado.
Ejecuta la instrucción para eliminar los activadores de tu base de datos, ya sea en un shell de MySQL o en una secuencia de comandos.
Después de colocar los activadores, aplica el archivo de volcado que hayas generado con la herramienta
mysqldump
. Para aplicar el archivo de volcado y volver a crear los objetos, introduce lo siguiente:$ mysql -uDBAuser -p -h IP_ADDRESS \ -P 3306 DB_NAME < dump_objects.sql
Haz los cambios siguientes:
- IP_ADDRESS: dirección IP de la instancia de Cloud SQL para MySQL
- DB_NAME: el nombre de la base de datos
Crear otra copia de seguridad de la instancia
Después de completar las actualizaciones, haz otra copia de seguridad de tu instancia. Para obtener más información, consulta Crear una copia de seguridad bajo demanda.
Ejemplos de secuencias de comandos
Si necesitas actualizar bases de datos, tablas y columnas, en esta sección se proporcionan ejemplos de secuencias de comandos para ayudarte a volver a codificar tus datos.
Secuencia de comandos para actualizar varias tablas
La siguiente secuencia de comandos genera una instrucción para todas las tablas de la base de datos indicada. Esta instrucción te permite volver a codificar los datos para que cumplan los nuevos ajustes de conjunto de caracteres y de orden.
SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION; ", "ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION; ") AS alter_sql FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'DB_NAME' AND TABLE_TYPE='BASE TABLE';
Haz los cambios siguientes:
- DB_NAME: el nombre de la base de datos que se va a actualizar
- NEW_CHARSET: el nuevo conjunto de caracteres que se aplicará a la tabla.
- NEW_COLLATION: la nueva ordenación que se aplicará a la tabla.
Ejemplo:
+--------------------------------------------------------------------------------------------+
|alter_sql
+--------------------------------------------------------------------------------------------+
| ALTER TABLE test1.t1 CHARACTER SET <new-charset> COLLATE <new-collation>;
ALTER TABLE test1.t1 CONVERT TO CHARACTER SET <new-charset> COLLATE <new-collation>; |
+--------------------------------------------------------------------------------------------+
Secuencia de comandos para actualizar varias columnas de una tabla
La siguiente secuencia de comandos genera una instrucción para todas las columnas de una tabla determinada. Esta instrucción te permite volver a codificar los datos para que cumplan los nuevos ajustes de conjunto de caracteres y de orden.
Genera instrucciones
ALTER TABLE
para todas las tablas de la base de datosSELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION; ") AS alter_table_statements FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'DB_NAME' AND TABLE_TYPE='BASE TABLE';
Haz los cambios siguientes:
- DB_NAME: el nombre de la base de datos que se va a actualizar
- NEW_CHARSET: el nuevo conjunto de caracteres que se aplicará a la tabla.
- NEW_COLLATION: la nueva ordenación que se aplicará a la tabla.
Ejemplo:
+------------------------------------------------------------------------------+ | alter_table_statements | +------------------------------------------------------------------------------+ | ALTER TABLE test1.t1 CHARACTER SET <new-charset> COLLATE <new-collation>; | +------------------------------------------------------------------------------+
Genera comandos
ALTER TABLE MODIFY
para cada tabla.SELECT CONCAT( "ALTER TABLE ", table_name, " MODIFY ", column_name, 'COLUMN_DEFINITION' , " CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION ") AS alter_table_column_statements FROM information_schema.columns WHERE table_schema = 'DB_NAME' AND table_name = 'TABLE_NAME' AND data_type IN ('char', 'varchar', 'tinytext', 'text', 'mediumtext', 'longtext','set','enum');
Haz los cambios siguientes:
- DB_NAME: el nombre de la base de datos que se va a actualizar
- TABLE_NAME: el nombre de la tabla que se va a actualizar
- COLUMN_DEFINITION: después de obtener los resultados de cada consulta, sustitúyalo por la definición de cada columna (las definiciones de las columnas pueden variar)
- NEW_CHARSET: el nuevo conjunto de caracteres que se aplicará a la columna de la tabla
- NEW_COLLATION: la nueva ordenación que se aplicará a la columna de la tabla
Ejemplo:
+-------------------------------------------------------------------------------------------------------------------------------------+ |alter_table_column_statements | +-------------------------------------------------------------------------------------------------------------------------------------+ | ALTER TABLE t1 MODIFY c <column-definition-replaced-after-obtaining-result-set> CHARACTER SET <new-charset> COLLATE <new-collation> | +-------------------------------------------------------------------------------------------------------------------------------------+