Atualize o conjunto de carateres e a ordenação de uma base de dados

Esta página descreve como atualizar o conjunto de carateres e a ordenação das bases de dados do Cloud SQL.

Vista geral

Quando cria uma base de dados no Cloud SQL para MySQL, pode especificar a configuração do conjunto de carateres e da ordenação para uma base de dados. Se não especificar valores personalizados para estas definições, a base de dados usa o valor predefinido. No MySQL, pode especificar valores personalizados para o conjunto de carateres e a ordenação a diferentes níveis de objetos, incluindo bases de dados, tabelas e colunas. Para mais informações sobre a utilização de configurações de conjunto de carateres e ordenação no MySQL, consulte o artigo Conjuntos de carateres, ordenações, Unicode.

Se quiser alterar o conjunto de carateres ou a ordenação da sua base de dados depois de já ter criado a base de dados e alguns objetos na base de dados, pode fazê-lo seguindo o procedimento descrito neste documento.

Este procedimento consiste nos seguintes passos:

  1. Verifique os valores atuais do conjunto de carateres e da ordenação.
  2. Determine o nível de atualização a realizar.
  3. Faça uma cópia de segurança da instância.
  4. Gerar comandos de reconstrução para objetos de base de dados armazenados.
  5. Faça atualizações às suas bases de dados e, se necessário, às tabelas e colunas.
  6. Valide as atualizações e procure erros.
  7. Recrie os objetos da base de dados armazenados.
  8. Faça outra cópia de segurança da instância.

Verifique os valores atuais do conjunto de carateres e da ordenação

Verifique os valores existentes configurados para o conjunto de carateres e a ordenação da sua base de dados e objetos da base de dados. Quando verifica a base de dados, também tem de verificar a configuração das respetivas tabelas, colunas e objetos armazenados. Pode usar as seguintes declarações para verificar as suas bases de dados e os respetivos objetos de base de dados.

Verifique a configuração da instância

Para verificar os valores globais predefinidos ao nível da instância (servidor), inicie uma shell do MySQL e introduza o seguinte comando:

mysql> SELECT @@character_set_server,@@collation_server;

Exemplo de saída:

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

Pode verificar se os valores globais predefinidos são diferentes dos valores personalizados que vai fornecer mais tarde para a sua base de dados.

Verifique a configuração da base de dados

Para verificar os valores do conjunto de carateres e da ordenação existentes ao nível da base de dados, use a seguinte declaração. Depois de executar cada declaração, crie uma lista de todas as bases de dados e objetos de base de dados que tem de atualizar com novos conjuntos de carateres ou valores de ordenação. A lista depende das bases de dados que quer alterar e do número de tabelas, colunas e objetos de base de dados que requerem atualizações de configuração.

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

Por exemplo, recebe o seguinte 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                 |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+

No entanto, quer alterar as bases de dados para os seguintes valores do 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                 |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+

Neste caso, para cada base de dados que tenha um valor que quer alterar, tem de atualizar cada objeto residente na base de dados.

Verifique a configuração das tabelas

Para verificar os valores existentes das tabelas, use a seguinte declaração:

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

Exemplo de saída:

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

Verifique a configuração das colunas da tabela

Para verificar os valores das colunas, use a seguinte declaração:

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

Exemplo de saída:

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

Verifique o esquema ou a base de dados ativos

Para verificar os detalhes do esquema ou da base de dados ativos, use a seguinte declaração.

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;

Exemplo de saída:

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

Verifique a configuração dos seus procedimentos armazenados

Para verificar os valores dos procedimentos armazenados, use a seguinte declaração:

SHOW PROCEDURE STATUS WHERE db = 'DB_NAME';

Substitua DB_NAME pelo nome da base de dados.

Exemplo de saída:

+-------+------+-----------+---------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| 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 obter a definição de um procedimento armazenado, use a seguinte declaração:

SHOW CREATE PROCEDURE DB_NAME.SP_NAME;

Substitua o seguinte:

  • DB_NAME: o nome da base de dados MySQL
  • SP_NAME: o nome do procedimento armazenado

Se um procedimento armazenado não estiver a usar o conjunto de carateres ou o valor de ordenação pretendido, pode ter de eliminá-lo e recriá-lo com o novo conjunto de carateres ou ordenação.

Verifique o mapeamento da ordenação da base de dados

No exemplo de saída anterior, o procedimento armazenado é criado com latin1_swedish_ci como a ordenação predefinida e o conjunto de carateres correspondente é latin1. Isto significa que todo o processamento ocorre através do conjunto de caracteres latin1 (a menos que parâmetros específicos do procedimento sejam etiquetados com um conjunto de caracteres personalizado). Se alterar apenas o conjunto de carateres e a ordenação ao nível da base de dados, a atualização ao nível da base de dados não atualiza automaticamente o procedimento armazenado. O procedimento continua a funcionar com o conjunto de carateres latin1 e a ordenação respetiva. A eliminação e a recriação do procedimento armazenado garantem que o procedimento começa a usar o novo conjunto de carateres e a nova ordenação da base de dados que acabou de atualizar.

Pode descobrir o mapeamento entre a ordenação da base de dados e o conjunto de carateres consultando a tabela information_schema.COLLATION_CHARACTER_SET_APPLICABILITY.

Use a seguinte declaração como exemplo:

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

Exemplo de saída:

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

Verifique a configuração dos acionadores

Para verificar os valores dos acionadores, use a seguinte declaração como exemplo.

SHOW TRIGGERS FROM DB_NAME;

Substitua DB_NAME pelo nome da base de dados do MySQL.

Para obter a definição de um acionador, use a seguinte declaração de exemplo.

SHOW CREATE trigger DB_NAME.TRIGGER_NAME;

Substitua o seguinte:

  • DB_NAME: o nome da base de dados MySQL
  • TRIGGER_NAME: o nome do acionador

Se o acionador não estiver a usar o conjunto de carateres ou o valor de ordenação pretendido, pode ter de o eliminar e recriar com o novo conjunto de carateres ou ordenação. Verifique se o acionador está a usar o mapeamento de intercalação da base de dados correto. Para mais informações sobre como verificar a ordenação da base de dados, consulte o artigo Verifique o mapeamento da ordenação da base de dados.

Verifique a configuração dos seus eventos

Para verificar os valores dos eventos, use a seguinte declaração como exemplo.

SHOW EVENTS FROM DB_NAME;

Substitua DB_NAME pelo nome da base de dados.

Para obter a definição de um evento, use a seguinte declaração de exemplo.

SHOW CREATE EVENT DB_NAME.EVENT_NAME;

Substitua o seguinte:

  • DB_NAME: o nome da base de dados
  • EVENT_NAME: o nome do evento

Se o evento não estiver a usar o conjunto de carateres ou o valor de ordenação pretendido, pode ter de eliminar e recriar o evento com o novo conjunto de carateres ou ordenação. Verifique se o evento está a usar o mapeamento de intercalação da base de dados correto. Para mais informações sobre como verificar a ordenação da base de dados, consulte o artigo Verifique o mapeamento da ordenação da base de dados.

Verifique a configuração das suas funções

Para verificar os valores das funções, use a seguinte declaração como exemplo.

SHOW FUNCTION STATUS WHERE db = 'DB_NAME';

Substitua DB_NAME pelo nome da base de dados.

Para obter a definição de uma função, use a seguinte declaração de exemplo.

SHOW CREATE FUNCTION DB_NAME.FUNCTION_NAME;

Substitua o seguinte:

  • DB_NAME: o nome da base de dados MySQL
  • FUNCTION_NAME: o nome da função

Se a função não estiver a usar o conjunto de carateres ou o valor de ordenação pretendido, pode ter de eliminar e recriar a função com o novo conjunto de carateres ou a nova ordenação. Verifique se a função está a usar o mapeamento de intercalação da base de dados correto. Para mais informações sobre como verificar a ordenação da base de dados, consulte o artigo Verifique o mapeamento da ordenação da base de dados.

I character set or collation. Verifique se a função está a usar o mapeamento de intercalação da base de dados correto. Para mais informações sobre como verificar a ordenação da base de dados, consulte o artigo Verifique o mapeamento da ordenação da base de dados.

Determine o nível de atualizações a executar

Depois de verificar a configuração do conjunto de carateres e da ordenação da sua base de dados, tem uma lista de bases de dados e, possivelmente, uma lista de objetos de base de dados que tem de atualizar.

O número de tarefas que tem de realizar depende do tipo de objetos da base de dados que requerem alterações de configuração.

Faça uma cópia de segurança da instância

Antes de fazer qualquer uma destas atualizações, faça uma cópia de segurança da sua instância. Para mais informações, consulte o artigo Crie uma cópia de segurança a pedido. Recomendamos que faça a cópia de segurança sem operações DDL em execução na instância.

Gerar comandos de recompilação para os objetos da base de dados armazenados na sua base de dados

Se precisar de eliminar e recriar objetos de base de dados armazenados nas suas bases de dados com o novo conjunto de carateres e ordenação, use a ferramenta mysqldump para gerar os comandos agora. Depois de atualizar as colunas da base de dados e da tabela, vai usar o ficheiro mysqldump gerado para reconstruir os objetos da base de dados armazenados na base de dados. Este comando gera declarações para todos os procedimentos armazenados, funções, acionadores e eventos.

Execute o seguinte comando para poder usar o resultado para recriar todos os procedimentos, funções e eventos armazenados de uma base de dados específica mais tarde (quando recriar objetos de base de dados armazenados).

$ 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

Substitua o seguinte:

  • IP_ADDRESS: endereço IP da instância do Cloud SQL para MySQL
  • DB_NAME: o nome da base de dados MySQL

Faça atualizações às suas bases de dados e, se necessário, às tabelas e colunas.

Neste passo, atualiza os valores do conjunto de carateres e da ordenação das suas bases de dados. Além disso, pode ter de reconstruir as tabelas e as colunas.

Faça atualizações ao nível da base de dados

Se estiver a fazer atualizações apenas ao nível da base de dados, execute a seguinte declaração para atualizar a base de dados:

ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

Substitua o seguinte:

  • DB_NAME: o nome da base de dados a atualizar
  • NEW_CHARSET: o novo conjunto de carateres a aplicar à base de dados
  • NEW_COLLATION: a nova ordenação a aplicar à base de dados

Faça atualizações ao nível da base de dados e da tabela

Se estiver a fazer atualizações ao nível da base de dados e da tabela, faça o seguinte:

  1. Execute a seguinte declaração para atualizar a sua base de dados:

    ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

    Substitua o seguinte:

    • DB_NAME: o nome da base de dados a atualizar
    • NEW_CHARSET: o novo conjunto de carateres a aplicar à base de dados
    • NEW_COLLATION: a nova ordenação a aplicar à base de dados
  2. Para cada tabela que quer atualizar, execute a seguinte declaração:

    ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

    Substitua o seguinte:

    • TABLE_NAME: o nome da tabela a atualizar
    • NEW_CHARSET: o novo conjunto de carateres a aplicar à tabela
    • NEW_COLLATION: a nova ordenação a aplicar à tabela

Faça atualizações ao nível da base de dados, da tabela e da coluna

Neste nível, tem de voltar a codificar os dados existentes para agir em conformidade com o novo conjunto de carateres e as definições de ordenação. Se estiver a fazer atualizações ao nível da base de dados, da tabela e da coluna, faça o seguinte:

  1. Antes de continuar com as atualizações das colunas da tabela, reveja as seguintes considerações:

    • A conversão do conjunto de carateres ALTER TABLE e da ordenação faz com que a tabela seja reconstruída e bloqueada. Como resultado, qualquer consulta ativa que tente aceder à tabela é bloqueada.
    • A conversão do conjunto de carateres ALTER TABLE e da ordenação demora tempo, porque obtém a tabela completa na memória. Esta operação pode aumentar a latência de qualquer carga de trabalho em execução em paralelo porque as páginas do conjunto de buffers estão a ser usadas para a tabela atualizada.
    • Se existirem consultas que acedem a várias tabelas e algumas das tabelas estiverem a ser atualizadas enquanto outras ainda não foram atualizadas, as consultas podem produzir resultados inconsistentes durante este período de transação.
    • O processo de execução de um conjunto de carateres e uma conversão de ordenação cria uma tabela oculta, pelo que deve planear a utilização do disco em conformidade.ALTER TABLE
    • A conversão do conjunto de carateres e da ordenação ALTER TABLE também faz com que todos os índices na tabela sejam reconstruídos.
    • Não tem de atualizar as instâncias de réplica em separado. Os comandos ALTER, DROP e CREATE são replicados automaticamente. No entanto, a execução de comandos DDL pode fazer com que o tempo de atraso da réplica aumente durante a operação.
    • Se restaurar alguma das bases de dados a partir de uma cópia de segurança feita antes de aplicar estas atualizações, tem de voltar a aplicar as atualizações.
  2. Verifique se existem tuplos de dados na tabela que possam ser incompatíveis com o novo conjunto de carateres. Se existirem incompatibilidades, tem de as corrigir antes de atualizar o conjunto de carateres. Caso contrário, ocorrem erros durante o processo de conversão. Pode usar a seguinte declaração SELECT CONVERT para validar os seus dados com o novo conjunto de carateres.

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

    Exemplo de saída:

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

    Neste exemplo, uma vez que a saída devolve estas três tuplas, existem três valores inconsistentes que têm de ser corrigidos. Antes de avançar para o passo seguinte, examine o resultado da consulta e corrija os dados até que a consulta devolva zero tuplos para todas as colunas que precisam de conversão. Também pode combinar várias colunas na mesma consulta.SELECT

  3. Escolha uma opção para atualizar o conjunto de carateres e a ordenação das tabelas ao nível da coluna.

  4. Se quiser atualizar o conjunto de carateres de uma coluna de tabela muito específica, siga os passos no separador ao nível da coluna, onde só tem de voltar a codificar as colunas selecionadas. Caso contrário, siga os passos no separador ao nível da tabela, que voltam a codificar a tabela completa.

    Ao nível da tabela

    1. Execute a seguinte declaração para atualizar a sua base de dados:

      ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Substitua o seguinte:

      • DB_NAME: o nome da base de dados a atualizar
      • NEW_CHARSET: o novo conjunto de carateres a aplicar à base de dados
      • NEW_COLLATION: a nova ordenação a aplicar à base de dados
    2. Para cada tabela afetada, execute a seguinte declaração para atualizar a tabela:

      ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Substitua o seguinte:

      • TABLE_NAME: o nome da tabela a atualizar
      • NEW_CHARSET: o novo conjunto de carateres a aplicar à tabela
      • NEW_COLLATION: a nova ordenação a aplicar à tabela
    3. Atualize ao nível da tabela para que todas as colunas que fazem parte da tabela sejam atualizadas com o novo conjunto de carateres e ordenação. Esta opção recompila a tabela completamente. Para usar esta opção, execute a seguinte declaração:

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

      Substitua o seguinte:

      • TABLE_NAME: o nome da tabela a atualizar
      • NEW_CHARSET: o novo conjunto de carateres a aplicar à tabela
      • NEW_COLLATION: a nova ordenação a aplicar à tabela

    Ao nível da coluna

    Atualização ao nível da coluna. Esta opção também recompila a tabela completamente. Se forem atualizadas várias colunas, esta opção pode causar várias recompilações.

    Para usar esta opção, execute a seguinte declaração:

    1. Execute a seguinte declaração para atualizar a sua base de dados:
    2. ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Substitua o seguinte:

      • DB_NAME: o nome da base de dados a atualizar
      • NEW_CHARSET: o novo conjunto de carateres a aplicar à base de dados
      • NEW_COLLATION: a nova ordenação a aplicar à base de dados
    3. Para cada tabela afetada, execute a seguinte declaração para atualizar a tabela:
    4. ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
       

      Substitua o seguinte:

      • TABLE_NAME: o nome da tabela a atualizar
      • NEW_CHARSET: o novo conjunto de carateres a aplicar à tabela
      • NEW_COLLATION: a nova ordenação a aplicar à tabela
    5. Execute a seguinte declaração para atualizar ao nível da coluna:
    6. ALTER TABLE DB_NAME.TABLE_NAME
      MODIFY COLUMN_DEFINITION CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;

      Substitua o seguinte:

      • DB_NAME: o nome da base de dados a atualizar
      • TABLE_NAME: o nome da tabela a atualizar
      • COLUMN_DEFINITION: especifique uma definição exata da coluna que inclua restrições. A definição da coluna pode conter os valores de conjunto de carateres e ordenação antigos. Tem de atualizar a definição da coluna com os novos valores.
      • NEW_CHARSET: o novo conjunto de carateres a aplicar à coluna da tabela
      • NEW_COLLATION: a nova ordenação a aplicar à coluna da tabela

      Repita esta declaração para todas as colunas de strings presentes na tabela que precisam de uma atualização do conjunto de carateres ou da ordenação.

Valide as atualizações e procure erros

Durante a operação ALTER TABLE, procure erros que indiquem que os dados existentes na tabela não são compatíveis com o novo conjunto de carateres. Por exemplo:

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

Se encontrar erros de compatibilidade de dados, recomendamos que verifique novamente as tabelas quanto a erros de compatibilidade de dados e os corrija antes de executar novamente as declarações ALTER TABLE para voltar a codificar os dados.

Além disso, durante a operação ALTER TABLE, as tabelas (a tabela de chaves externas e a tabela referenciada), uma verificação de chaves externas pode falhar enquanto a coluna é recodificada. Se isto acontecer, pode desativar a verificação de chave externa (SET FOREIGN_KEY_CHECKS=0;) e executar a atualização novamente.

Recrie os objetos da base de dados armazenados

Depois de atualizar a base de dados com êxito, pode usar o ficheiro mysqldump gerado para recriar os objetos da base de dados armazenados com os valores de conjunto de carateres e intercalação.

Para recriar os objetos da base de dados armazenados, faça o seguinte:

  1. Verifique se os objetos da base de dados armazenados estão presentes na base de dados.
  2. Certifique-se de que não existe um carregamento paralelo que espere que os objetos da base de dados armazenados estejam presentes durante este período de eliminação e recriação.
  3. O ficheiro mysqldump que gerou com a ferramenta mysqldump não inclui a declaração para eliminar acionadores. Se precisar de eliminar acionadores, abra um terminal MySQL para gerar a declaração DROP para acionadores.

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

  5. Execute a declaração para eliminar os acionadores da sua base de dados, quer numa shell do MySQL ou num script.

  6. Depois de largar os acionadores, aplique o ficheiro de despejo que gerou com a ferramenta mysqldump. Para aplicar o ficheiro de despejo e recriar os objetos, introduza o seguinte:

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

    Substitua o seguinte:

    • IP_ADDRESS: endereço IP da instância do Cloud SQL para MySQL
    • DB_NAME: o nome da base de dados

Faça outra cópia de segurança da instância

Depois de concluir as atualizações, faça outra cópia de segurança da sua instância. Para mais informações, consulte o artigo Crie uma cópia de segurança a pedido.

Exemplos de guiões

Se precisar de atualizar bases de dados, tabelas e colunas, esta secção fornece exemplos de scripts para ajudar a recodificar os seus dados.

Script para atualizar várias tabelas

O script seguinte gera uma declaração para todas as tabelas na base de dados especificada. A declaração permite-lhe voltar a codificar os dados existentes para agir em conformidade com as novas definições de ordenação e conjunto de carateres.

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

Substitua o seguinte:

  • DB_NAME: o nome da base de dados a atualizar
  • NEW_CHARSET: o novo conjunto de carateres a aplicar à tabela
  • NEW_COLLATION: a nova ordenação a aplicar à tabela

Exemplo de saída:

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

Script para atualizar várias colunas numa tabela

O script seguinte gera uma declaração para todas as colunas numa determinada tabela. A declaração permite-lhe voltar a codificar os dados existentes para agir em conformidade com as novas definições de ordenação e conjunto de carateres.

  1. Gere declarações ALTER TABLE para todas as tabelas na base de dados

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

    Substitua o seguinte:

    • DB_NAME: o nome da base de dados a atualizar
    • NEW_CHARSET: o novo conjunto de carateres a aplicar à tabela
    • NEW_COLLATION: a nova ordenação a aplicar à tabela

    Exemplo de saída:

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

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

    Substitua o seguinte:

    • DB_NAME: o nome da base de dados a atualizar
    • TABLE_NAME: o nome da tabela a atualizar
    • COLUMN_DEFINITION: depois de obter os resultados de cada consulta, substitua pela definição da coluna para cada coluna (as definições das colunas podem variar entre colunas)
    • NEW_CHARSET: o novo conjunto de carateres a aplicar à coluna da tabela
    • NEW_COLLATION: a nova ordenação a aplicar à coluna da tabela

    Exemplo de saída:

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

O que se segue?