Actualiza el grupo de caracteres y la intercalación de una base de datos

En esta página, se describe cómo actualizar el grupo de caracteres y la intercalación de las bases de datos de Cloud SQL.

Descripción general

Cuando creas una base de datos en Cloud SQL para MySQL, puedes especificar el grupo de caracteres y la configuración de la intercalación de una base de datos. Si no especificas valores personalizados para estos parámetros de configuración, la base de datos usará el valor predeterminado. En MySQL, puedes especificar valores personalizados para el grupo de caracteres y la intercalación en diferentes niveles de objetos, incluidas las bases de datos, las tablas y las columnas. Para obtener más información sobre el uso de la configuración de grupos de caracteres y de intercalaciones en MySQL, consulta Grupos de caracteres, intercalaciones, Unicode.

Si quieres cambiar el grupo de caracteres o la intercalación de tu base de datos después de que ya la hayas creado y hayas agregado algunos objetos a ella, puedes hacerlo siguiendo el procedimiento que se indica en este documento.

Este procedimiento consta de los siguientes pasos:

  1. Verifica los valores actuales del grupo de caracteres y la intercalación.
  2. Determina el nivel de actualización que se realizará.
  3. Realiza una copia de seguridad de la instancia.
  4. Genera comandos de reconstrucción para objetos de base de datos almacenados.
  5. Realiza actualizaciones a tus bases de datos y, si es necesario, tablas y columnas.
  6. Valida las actualizaciones y busca errores.
  7. Vuelve a crear los objetos de la base de datos almacenados.
  8. Crea otra copia de seguridad de la instancia.

Verifica los valores actuales del grupo de caracteres y la intercalación

Verifica los valores existentes que están configurados para el grupo de caracteres y la intercalación de tu base de datos y sus objetos. Cuando verificas tu base de datos, también debes verificar la configuración de sus tablas, columnas y objetos almacenados. Puedes usar las siguientes sentencias para verificar las bases de datos y sus objetos de base de datos.

Verifica la configuración de tu instancia

Para verificar los valores globales predeterminados a nivel de la instancia (servidor), inicia una shell de MySQL y, luego, ingresa el siguiente comando:

mysql> SELECT @@character_set_server,@@collation_server;

Resultado de ejemplo:

+------------------------+--------------------+
| @@character_set_server | @@collation_server |
+------------------------+--------------------+
| utf8mb4                | utf8mb4_0900_ai_ci |
+------------------------+--------------------+
1 row in set (0.00 sec)

Puedes verificar que los valores globales predeterminados sean diferentes de los valores personalizados que proporcionarás a tu base de datos más adelante.

Verifica la configuración de tu base de datos

Para verificar el grupo de caracteres existente y los valores de intercalación a nivel de base de datos, usa la siguiente instrucción. Después de ejecutar cada sentencia, haz una lista de todas las bases de datos y los objetos de base de datos que debes actualizar con nuevos grupos de caracteres o valores de intercalación. La lista depende de las bases de datos que desees cambiar y cuántas tablas, columnas y objetos de base de datos requieren actualizaciones de configuración.

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
WHERE schema_name
NOT IN ('performance_schema', 'mysql', 'sys', 'information_schema');

Por ejemplo, recibirás el resultado siguiente:

+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| 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 personalizados del grupo de caracteres:

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

Luego, en este caso, para cada base de datos que tenga un valor que deseas cambiar, debes actualizar cada objeto que resida en la base de datos.

Verifica la configuración de tus tablas

Para verificar los valores existentes de las tablas, usa la siguiente sentencia:

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');

Resultado de 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   |
+------------+--------------+--------------------+-------------------+

Verifica la configuración de las columnas de tu tabla

Para verificar los valores de las columnas, usa la siguiente sentencia:

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');

Resultado de 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             |
+--------------+------------+-------------+--------------------+------------------+

Verificar el esquema o la base de datos activos

Para verificar 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;

Resultado de ejemplo:

+------------+
| DATABASE() |
+------------+
| test3      |
+------------+
+--------------+------------+------------------+-------------+-------------+--------------------+
| TABLE_SCHEMA | TABLE_NAME | DEFAULT_CHAR_SET | COLUMN_NAME | COLUMN_TYPE | CHARACTER_SET_NAME |
+--------------+------------+------------------+-------------+-------------+--------------------+
| test3        | t3         | utf16            | summary     | text        | utf16              |
+--------------+------------+------------------+-------------+-------------+--------------------+

Verifica la configuración de tus procedimientos almacenados

Para verificar los valores de los procedimientos almacenados, usa la siguiente instrucción:

SHOW PROCEDURE STATUS WHERE db = 'DB_NAME';

Reemplaza DB_NAME por el nombre de la base de datos.

Resultado de 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;

Reemplaza lo siguiente:

  • DB_NAME: el nombre de la base de datos de MySQL
  • SP_NAME: el nombre del procedimiento almacenado

Si un procedimiento almacenado no usa el grupo de caracteres o el valor de intercalación previstos, es posible que debas descartarlo y volver a crearlo con el grupo de caracteres o la intercalación nuevos.

Verifica la asignación de intercalación de la base de datos

En el resultado del ejemplo anterior, el procedimiento almacenado se crea con latin1_swedish_ci como la intercalación predeterminada y el grupo de caracteres correspondiente es latin1. Esto significa que todo el procesamiento se realiza mediante el grupo de caracteres latin1 (a menos que los parámetros específicos del procedimiento estén etiquetados con un grupo de caracteres personalizado). Si solo cambias el grupo de caracteres y la intercalación a nivel de la base de datos, la actualización a nivel de la base de datos no actualiza el procedimiento almacenado automáticamente. El procedimiento continúa operando con el grupo de caracteres latin1 y la respectiva intercalación. Si descartas y vuelves a crear el procedimiento almacenado, se garantiza que el procedimiento comience a usar el nuevo grupo de caracteres y la nueva intercalación de la base de datos que acabas de actualizar.

Para averiguar la asignación entre la intercalación de la base de datos y el grupo de caracteres, consulta 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");

Resultado de ejemplo:

+--------------------+
| CHARACTER_SET_NAME |
+--------------------+
| latin1             |
+--------------------+

Verifica la configuración de tus activadores

Para verificar los valores de los activadores, usa la siguiente sentencia como ejemplo.

SHOW TRIGGERS FROM DB_NAME;

Reemplaza DB_NAME por el nombre de la base de datos de MySQL.

Para obtener la definición de un activador, usa la siguiente sentencia de ejemplo.

SHOW CREATE trigger DB_NAME.TRIGGER_NAME;

Reemplaza lo siguiente:

  • DB_NAME: el nombre de la base de datos de MySQL
  • TRIGGER_NAME: el nombre del activador

Si el activador no usa el grupo de caracteres o el valor de intercalación deseados, es posible que debas descartarlo y volver a crearlo con el grupo de caracteres o la intercalación nuevos. Comprueba que el activador use la asignación correcta de intercalación de bases de datos. Para obtener más información sobre cómo verificar la intercalación de la base de datos, consulta Verifica la asignación de intercalación de la base de datos.

Verifica la configuración de tus eventos

Para verificar los valores de los eventos, usa la siguiente instrucción como ejemplo.

SHOW EVENTS FROM DB_NAME;

Reemplaza DB_NAME por el nombre de la base de datos.

Para obtener la definición de un evento, usa la siguiente sentencia de ejemplo.

SHOW CREATE EVENT DB_NAME.EVENT_NAME;

Reemplaza lo siguiente:

  • DB_NAME: el nombre de la base de datos
  • EVENT_NAME: el nombre del evento

Si el evento no usa el valor de intercalación o el grupo de caracteres que deseas, es posible que necesites soltar y volver a crearlo con el nuevo grupo de caracteres o la intercalación. Verifica que el evento use la asignación de intercalación de la base de datos correcta. Para obtener más información sobre cómo verificar la intercalación de la base de datos, consulta Verifica la asignación de intercalación de la base de datos.

Verifica la configuración de tus funciones

Para verificar los valores de las funciones, usa la siguiente sentencia como ejemplo.

SHOW FUNCTION STATUS WHERE db = 'DB_NAME';

Reemplaza DB_NAME por el nombre de la base de datos.

Para obtener la definición de una función, usa la siguiente sentencia de ejemplo.

SHOW CREATE FUNCTION DB_NAME.FUNCTION_NAME;

Reemplaza lo siguiente:

  • DB_NAME: el nombre de la base de datos de MySQL
  • FUNCTION_NAME: el nombre de la función

Si la función no usa el valor de intercalación o el grupo de caracteres que deseas, es posible que debas descartarla y volver a crearla con el grupo de caracteres o la intercalación nuevos. Verifica que la función use la asignación de intercalación de base de datos correcta. Para obtener más información sobre cómo verificar la intercalación de la base de datos, consulta Verifica la asignación de intercalación de la base de datos.

I grupo de caracteres o intercalación. Verifica que la función use la asignación de intercalación de base de datos correcta. Para obtener más información sobre cómo verificar la intercalación de la base de datos, consulta Verifica la asignación de intercalación de la base de datos.

Determina qué nivel de actualizaciones realizar

Después de verificar el grupo de caracteres y la configuración de intercalación de tu base de datos, tienes una lista de bases de datos y, posiblemente, una lista de objetos de base de datos que debes actualizar.

La cantidad de tareas que deberás realizar dependerá del tipo de objetos de la base de datos que requieran cambios de configuración.

Crea una copia de seguridad de la instancia

Antes de realizar cualquiera de estas actualizaciones, haz una copia de seguridad de tu instancia. Para obtener más información, consulta Crea una copia de seguridad a pedido. Te recomendamos que crees la copia de seguridad sin que se ejecuten operaciones de DDL en la instancia.

Genera comandos de reconstrucción para los objetos de la base de datos almacenados en ella.

Si necesitas descartar y volver a crear objetos de base de datos almacenados en tus bases de datos con el nuevo grupo de caracteres y la nueva ordenación, usa la herramienta mysqldump para generar los comandos ahora. Después de actualizar la base de datos y las columnas de la tabla, usarás el archivo mysqldump generado para volver a compilar los objetos de la base de datos almacenados en la base de datos. Este comando genera sentencias para todos los procedimientos, funciones, activadores y eventos almacenados.

Ejecuta el siguiente comando para que puedas usar el resultado a fin de volver a crear todos los procedimientos, funciones y eventos almacenados de una base de datos en particular 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

Reemplaza lo siguiente:

  • IP_ADDRESS: Es la dirección IP de la instancia de Cloud SQL para MySQL.
  • DB_NAME: el nombre de la base de datos de MySQL

Realiza actualizaciones en tus bases de datos y, si es necesario, en tablas y columnas.

En este paso, actualizas los valores del grupo de caracteres y la intercalación de tus bases de datos. Además, es posible que debas volver a compilar tus tablas y columnas.

Realiza actualizaciones a nivel de la base de datos

Si solo realizas actualizaciones a nivel de la base de datos, ejecuta la siguiente sentencia para actualizarla:

ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

Reemplaza lo siguiente:

  • DB_NAME: Es el nombre de la base de datos que se actualizará
  • NEW_CHARSET: El nuevo grupo de caracteres que se aplicará a la base de datos
  • NEW_COLLATION: La nueva intercalación que se aplicará a la base de datos

Realiza actualizaciones a nivel de la base de datos y de la tabla

Si realizas actualizaciones a nivel de la base de datos y de la tabla, haz lo siguiente:

  1. Ejecuta la siguiente sentencia para actualizar tu base de datos:

    ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
    

    Reemplaza lo siguiente:

    • DB_NAME: Es el nombre de la base de datos que se actualizará
    • NEW_CHARSET: El nuevo grupo de caracteres que se aplicará a la base de datos
    • NEW_COLLATION: La nueva intercalación que se aplicará a la base de datos
  2. Para cada tabla que quieras actualizar, ejecuta la siguiente sentencia:

    ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
    

    Reemplaza lo siguiente:

    • TABLE_NAME: el nombre de la tabla que se actualizará
    • NEW_CHARSET: el nuevo grupo de caracteres que se aplicará a la tabla
    • NEW_COLLATION: la nueva intercalación que se aplicará a la tabla

Realiza actualizaciones a nivel de la base de datos, la tabla y la columna

En este nivel, debes volver a codificar los datos existentes para cumplir con la nueva configuración de intercalación y grupo de caracteres. Si realizas actualizaciones a nivel de base de datos, tabla y columna, haz lo siguiente:

  1. Antes de continuar con las actualizaciones de las columnas de la tabla, revisa las siguientes consideraciones:

    • La conversión del grupo de caracteres y la intercalación de ALTER TABLE hacen que la tabla se vuelva a compilar y se bloquee. Como resultado, cualquier consulta activa que intente acceder a la tabla se bloquea.
    • La conversión de intercalación y grupo de caracteres ALTER TABLE lleva tiempo porque recupera la tabla completa en la memoria. Esta operación podría aumentar la latencia de cualquier carga de trabajo que se ejecute en paralelo, ya que se usan las páginas del grupo de búferes 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 actualizan, es posible que las consultas generen resultados incoherentes durante este tiempo de transacción.
    • El proceso de ejecutar una conversión de grupo de caracteres y de ordenación ALTER TABLE crea una tabla en sombra, por lo que debes planificar el uso del disco según corresponda.
    • La conversión del grupo de caracteres ALTER TABLE y la intercalación también hace que se vuelvan a compilar los índices de la tabla.
    • No es necesario que actualices las instancias de réplica por separado. Los comandos ALTER, DROP y CREATE se replican de forma automática. Sin embargo, ejecutar comandos de DDL puede hacer que el tiempo del retraso de la réplica aumente durante la operación.
    • Si restableces alguna de las bases de datos desde una copia de seguridad que se tomó antes de aplicar estas actualizaciones, deberás volver a aplicarlas.
  2. Comprueba si hay tuplas de datos que puedan ser incompatibles con el nuevo grupo de caracteres. Si hay incompatibilidades, debes corregirlas antes de actualizar el grupo de caracteres. De lo contrario, encontrarás errores durante el proceso de conversión. Puedes usar la siguiente declaración SELECT CONVERT para validar tus datos con un grupo de caracteres nuevo.

    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);
    

    Resultado de ejemplo:

    +------+--------------------------+
    | c    | convert(c using 'ascii') |
    +------+--------------------------+
    | é    | ?                        |
    | é    | ?                        |
    | £    | ?                        |
    +------+--------------------------+
    

    En este ejemplo, como el resultado muestra estas tres tuplas, hay tres valores incoherentes que se deben corregir. Antes de continuar con el siguiente paso, examina el resultado de tu consulta y corrige los datos hasta que tu consulta muestre cero tuplas para todas las columnas que necesitan conversión. También puedes combinar varias columnas en la misma consulta SELECT.

  3. Elige una opción para actualizar el grupo de caracteres y la intercalación de las tablas a nivel de columna.

  4. Si deseas actualizar el grupo de caracteres de una columna de tabla muy específica, sigue los pasos que se indican en la pestaña Nivel de columna, en la que solo debes volver a codificar las columnas seleccionadas. De lo contrario, sigue los pasos que se indican en la pestaña Nivel de tabla, que vuelve a codificar la tabla completa.

    Nivel de tabla

    1. Ejecuta la siguiente sentencia para actualizar tu base de datos:

      ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
      

      Reemplaza lo siguiente:

      • DB_NAME: Es el nombre de la base de datos que se actualizará
      • NEW_CHARSET: El nuevo grupo de caracteres que se aplicará a la base de datos
      • NEW_COLLATION: La nueva intercalación que se aplicará a la base de datos
    2. En cada tabla afectada, ejecuta la siguiente instrucción para actualizar tu tabla:

      ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
      

      Reemplaza lo siguiente:

      • TABLE_NAME: el nombre de la tabla que se actualizará
      • NEW_CHARSET: el nuevo grupo de caracteres que se aplicará a la tabla
      • NEW_COLLATION: la nueva intercalación que se aplicará a la tabla
    3. Actualiza a nivel de la tabla para que todas las columnas que forman parte de la tabla se actualicen con el grupo de caracteres y la intercalación nuevos. Esta opción vuelve a compilar la tabla por completo. Para usar esta opción, ejecuta la siguiente sentencia:

      ALTER TABLE DB_NAME.TABLE_NAME
      CONVERT TO CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
      

      Reemplaza lo siguiente:

      • TABLE_NAME: el nombre de la tabla que se actualizará
      • NEW_CHARSET: el nuevo grupo de caracteres que se aplicará a la tabla
      • NEW_COLLATION: la nueva intercalación que se aplicará a la tabla

    Nivel de columna

    Actualiza a nivel de la columna. Esta opción también vuelve a compilar la tabla por completo. Si se actualizan varias columnas, esta opción puede provocar varias recompilaciones.

    Para usar esta opción, ejecuta la siguiente sentencia:

    1. Ejecuta la siguiente sentencia para actualizar tu base de datos:
    2. ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
      

      Reemplaza lo siguiente:

      • DB_NAME: Es el nombre de la base de datos que se actualizará
      • NEW_CHARSET: El nuevo grupo de caracteres que se aplicará a la base de datos
      • NEW_COLLATION: La nueva intercalación que se aplicará a la base de datos
    3. En cada tabla afectada, ejecuta la siguiente instrucción para actualizar tu tabla:
    4. ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
       

      Reemplaza lo siguiente:

      • TABLE_NAME: el nombre de la tabla que se actualizará
      • NEW_CHARSET: el nuevo grupo de caracteres que se aplicará a la tabla
      • NEW_COLLATION: la nueva intercalación que se aplicará a la tabla
    5. Ejecuta la siguiente sentencia para actualizar a nivel de la columna:
    6. ALTER TABLE DB_NAME.TABLE_NAME
      MODIFY COLUMN_DEFINITION CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
      

      Reemplaza lo siguiente:

      • DB_NAME: Es el nombre de la base de datos que se actualizará
      • TABLE_NAME: el nombre de la tabla que se actualizará
      • COLUMN_DEFINITION: Especifica una definición de columna exacta que incluya restricciones. La definición de la columna podría llevar los valores del grupo de caracteres y la intercalación anteriores. Debes actualizar la definición de la columna con los valores nuevos.
      • NEW_CHARSET: el nuevo grupo de caracteres que se aplicará a la columna de la tabla
      • NEW_COLLATION: la nueva intercalación que se aplicará a la columna de la tabla

      Repite esta declaración para todas las columnas de string presentes en la tabla que necesiten una actualización del grupo de caracteres o de la intercalación.

Valida las actualizaciones y busca errores

Durante la operación ALTER TABLE, busca errores que indiquen que los datos existentes en la tabla no son compatibles con el nuevo grupo de caracteres. Por ejemplo:

ERROR 1366 (HY000): Incorrect string value: '\xC3\xA9' for column 'c' at row 1

Si encuentras algún error de compatibilidad de datos, te recomendamos que recuerdes tus tablas en busca de errores de compatibilidad de datos y los corrijas antes de volver a ejecutar las sentencias 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 a la que se hace referencia) pueden fallar en la verificación de claves externas mientras la columna se vuelve a codificar. Si esto sucede, puedes inhabilitar la verificación de clave externa (SET FOREIGN_KEY_CHECKS=0;) y volver a ejecutar la actualización.

Vuelve a crear los objetos de la base de datos almacenados

Después de actualizar tu base de datos correctamente, puedes usar el archivo mysqldump generado para volver a crear los objetos de la base de datos almacenados con el grupo de caracteres y los valores de intercalación.

Para volver a crear los objetos de la base de datos almacenados, haz lo siguiente:

  1. Verifica que los objetos de la base de datos almacenados estén presentes en la base de datos.
  2. Asegúrate de que no haya una carga en paralelo que espere que los objetos de la base de datos almacenados estén presentes durante esta caída y el tiempo de recreación.
  3. El archivo mysqldump que generaste con la herramienta de mysqldump no incluye la instrucción para descartar activadores. Si necesitas descartar activadores, abre una terminal de MySQL a fin de generar la declaración DROP para los activadores.

    mysql> SELECT CONCAT('DROP TRIGGER ', TRIGGER_NAME, ';') AS
    drop_trigger_statements FROM information_schema.TRIGGERS
    WHERE TRIGGER_SCHEMA = DB_NAME;
    
  4. Copia el resultado.

  5. Ejecuta la instrucción para descartar los activadores de tu base de datos, ya sea en una shell de MySQL o en una secuencia de comandos.

  6. Después de colocar los activadores, aplica el archivo de volcado que generaste con la herramienta mysqldump. Para aplicar el archivo de volcado y volver a crear los objetos, ingresa lo siguiente:

    $ mysql -uDBAuser -p -h IP_ADDRESS \
      -P 3306 DB_NAME < dump_objects.sql
    

    Reemplaza lo siguiente:

    • IP_ADDRESS: Es la dirección IP de la instancia de Cloud SQL para MySQL.
    • DB_NAME: el nombre de la base de datos

Crea otra copia de seguridad de la instancia

Después de completar las actualizaciones, crea otra copia de seguridad de la instancia. Para obtener más información, consulta Crea una copia de seguridad a pedido.

Ejemplos de secuencias de comandos

Si necesitas actualizar bases de datos, tablas y columnas, en esta sección, se proporcionan secuencias de comandos de ejemplo para ayudarte a volver a codificar los datos.

Secuencia de comandos para actualizar varias tablas

La siguiente secuencia de comandos genera una declaración para todas las tablas en la base de datos determinada. La instrucción te permite volver a codificar los datos existentes para cumplir con el nuevo grupo de caracteres y la configuración de intercalación.

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';

Reemplaza lo siguiente:

  • DB_NAME: Es el nombre de la base de datos que se actualizará
  • NEW_CHARSET: el nuevo grupo de caracteres que se aplicará a la tabla
  • NEW_COLLATION: la nueva intercalación que se aplicará a la tabla

Resultado de 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 en una tabla

La siguiente secuencia de comandos genera una sentencia para todas las columnas de una tabla determinada. La instrucción te permite volver a codificar los datos existentes para cumplir con el nuevo grupo de caracteres y la configuración de intercalación.

  1. Genera declaraciones ALTER TABLE para todas las tablas en la base de datos

    SELECT 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';
    

    Reemplaza lo siguiente:

    • DB_NAME: Es el nombre de la base de datos que se actualizará
    • NEW_CHARSET: el nuevo grupo de caracteres que se aplicará a la tabla
    • NEW_COLLATION: la nueva intercalación que se aplicará a la tabla

    Resultado de ejemplo:

    +------------------------------------------------------------------------------+
    | alter_table_statements                                                       |
    +------------------------------------------------------------------------------+
    | ALTER TABLE test1.t1 CHARACTER SET <new-charset> COLLATE <new-collation>;    |
    +------------------------------------------------------------------------------+
    
  2. Para cada tabla, genera comandos ALTER TABLE MODIFY.

    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');
    

    Reemplaza lo siguiente:

    • DB_NAME: Es el nombre de la base de datos que se actualizará
    • TABLE_NAME: el nombre de la tabla que se actualizará
    • COLUMN_DEFINITION: Después de obtener los resultados de cada consulta, reemplázalo por la definición de columna para cada columna (las definiciones pueden variar entre columnas).
    • NEW_CHARSET: el nuevo grupo de caracteres que se aplicará a la columna de la tabla
    • NEW_COLLATION: la nueva intercalación que se aplicará a la columna de la tabla

    Resultado de ejemplo:

    +-------------------------------------------------------------------------------------------------------------------------------------+
    |alter_table_column_statements                                                                                                        |
    +-------------------------------------------------------------------------------------------------------------------------------------+
    | ALTER TABLE t1 MODIFY c <column-definition-replaced-after-obtaining-result-set> CHARACTER SET <new-charset> COLLATE <new-collation>  |
    +-------------------------------------------------------------------------------------------------------------------------------------+
    

¿Qué sigue?