Esta página descreve como atualizar o conjunto de caracteres e a ordenação de bancos de dados do Cloud SQL.
Visão geral
Ao criar um banco de dados no Cloud SQL para MySQL, é possível especificar a configuração de conjunto de caracteres e ordenação de um banco de dados. Se você não especificar valores personalizados para essas configurações, o banco de dados usará o valor padrão. No MySQL, é possível especificar valores personalizados para o conjunto de caracteres e a ordenação em diferentes níveis de objetos, como bancos de dados, tabelas e colunas. Para mais informações sobre o uso de configurações de conjunto de caracteres e ordenação no MySQL, consulte Conjuntos de caracteres, ordenações, Unicode.
Se você quiser alterar o conjunto de caracteres ou a ordenação do banco de dados depois de criar o banco de dados e alguns objetos nele, siga o procedimento descrito neste documento para fazer isso.
Esse procedimento consiste nas seguintes etapas:
- Conferir os valores atuais do conjunto de caracteres e da ordenação.
- Determinar o nível de atualização que será usado.
- Fazer um backup da instância.
- Gerar comandos de recriação para objetos de banco de dados armazenados.
- Executar atualizações nos bancos de dados e, se necessário, em tabelas e colunas.
- Validar as atualizações e procurar erros.
- Recriar os objetos de banco de dados armazenados.
- Fazer outro backup da instância.
Conferir os valores atuais do conjunto de caracteres e da ordenação
Verifique os valores existentes configurados para o conjunto de caracteres e a ordenação do banco de dados e dos objetos de banco de dados. Ao verificar o banco de dados, você também precisa verificar a configuração das respectivas tabelas, colunas e objetos armazenados. É possível usar as seguintes instruções para verificar o banco de dados e os objetos dele.
Verificar a configuração da instância
Para verificar os valores globais padrão no nível da instância (servidor), inicie um shell do MySQL e insira 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)
É possível verificar se os valores globais padrão são diferentes dos valores personalizados que você fornecerá para o banco de dados mais tarde.
Verificar a configuração do banco de dados
Para verificar os valores existentes do conjunto de caracteres e da ordenação no nível do banco de dados, use a instrução a seguir. Depois de executar cada instrução, faça uma lista de todos os bancos de dados e objetos de banco de dados que você precisa atualizar com novos valores de conjuntos de caracteres ou ordenação. A lista depende dos bancos de dados que você quer mudar e da quantidade de tabelas, colunas e objetos de banco de dados que exigem atualizações de configuração.
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE schema_name NOT IN ('performance_schema', 'mysql', 'sys', 'information_schema');
Por exemplo, você recebe a seguinte saída:
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
| 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, você quer mudar os bancos de dados para os seguintes valores personalizados do conjunto 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 |
+--------------+-------------+----------------------------+------------------------+----------+--------------------+
Nesse caso, para cada banco de dados que tenha um valor que você quer mudar, é necessário atualizar cada objeto que está no banco de dados.
Verificar a configuração das tabelas
Para verificar os valores existentes das tabelas, use a seguinte instruçã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 |
+------------+--------------+--------------------+-------------------+
Verificar a configuração das colunas da tabela
Para verificar os valores das colunas, use a seguinte instruçã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 |
+--------------+------------+-------------+--------------------+------------------+
Verificar o esquema ou banco de dados ativo
Para verificar os detalhes do esquema ativo ou banco de dados, use a seguinte instruçã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 |
+--------------+------------+------------------+-------------+-------------+--------------------+
Verificar a configuração dos seus procedimentos armazenados
Para verificar os valores dos procedimentos armazenados, use a seguinte instrução:
SHOW PROCEDURE STATUS WHERE db = 'DB_NAME';
Substitua DB_NAME pelo nome do banco 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 conferir a definição de um procedimento armazenado, use a seguinte instrução:
SHOW CREATE PROCEDURE DB_NAME.SP_NAME;
Substitua:
- DB_NAME: o nome do banco de dados do MySQL
- SP_NAME: o nome do procedimento armazenado
Se um procedimento armazenado não estiver usando o valor esperado do conjunto de caracteres ou da ordenação, talvez seja necessário remover e recriar o procedimento com o novo conjunto de caracteres ou ordenação.
Verificar o mapeamento da ordenação do banco de dados
Na saída do exemplo anterior, o procedimento armazenado é criado com latin1_swedish_ci
como a ordenação padrão, e o conjunto de caracteres correspondente é latin1
. Ou seja, todo o processamento ocorre com este conjunto de caracteres latin1
(a menos que parâmetros específicos do procedimento incluam tags de um conjunto de caracteres personalizado). Se você mudar apenas o conjunto de caracteres e a ordenação no nível do banco de dados, a atualização no nível do banco de dados não atualizará automaticamente o procedimento armazenado. O procedimento continua a funcionar com o conjunto de caracteres latin1
e a respectiva ordenação.
Remover e recriar o procedimento armazenado garante que o ele seja iniciado para que use o novo conjunto de caracteres e a nova ordenação do banco de dados que você acabou de atualizar.
É possível consultar a tabela information_schema.COLLATION_CHARACTER_SET_APPLICABILITY
para descobrir o mapeamento entre a ordenação e o conjunto de caracteres do banco de dados.
Use a instrução a seguir 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 |
+--------------------+
Verificar a configuração dos gatilhos
Para verificar os valores dos gatilhos, use a seguinte instrução como exemplo.
SHOW TRIGGERS FROM DB_NAME;
Substitua DB_NAME pelo nome do banco de dados do MySQL.
Para conferir a definição de um gatilho, use o exemplo de instrução a seguir.
SHOW CREATE trigger DB_NAME.TRIGGER_NAME;
Substitua:
- DB_NAME: o nome do banco de dados do MySQL
- TRIGGER_NAME: o nome do gatilho
Se o gatilho não estiver usando o valor esperado do conjunto de caracteres ou da ordenação, talvez seja necessário remover e recriar o gatilho com o novo de conjunto de caracteres ou ordenação. Verifique se o gatilho está usando o mapeamento de ordenação do banco de dados correto. Para mais informações sobre como verificar a ordenação do banco de dados, consulte Verificar o mapeamento de ordenação do banco de dados.
Verificar a configuração dos seus eventos
Para verificar os valores dos eventos, use a seguinte instrução como exemplo.
SHOW EVENTS FROM DB_NAME;
Substitua DB_NAME pelo nome do banco de dados.
Para conferir a definição de um evento, use a instrução de exemplo a seguir.
SHOW CREATE EVENT DB_NAME.EVENT_NAME;
Substitua:
- DB_NAME: o nome do banco de dados
- EVENT_NAME: o nome do evento
Se o evento não estiver usando o valor esperado do conjunto de caracteres ou da compilação, talvez seja necessário remover e recriar o evento com o novo conjunto de caracteres ou ordenação. Verifique se o evento está usando o mapeamento de ordenação do banco de dados correto. Para mais informações sobre como verificar a ordenação do banco de dados, consulte Verificar o mapeamento de ordenação do banco de dados.
Verificar a configuração das funções
Para verificar os valores das funções, use a seguinte instrução como exemplo.
SHOW FUNCTION STATUS WHERE db = 'DB_NAME';
Substitua DB_NAME pelo nome do banco de dados.
Para conferir a definição de uma função, use o exemplo de instrução a seguir.
SHOW CREATE FUNCTION DB_NAME.FUNCTION_NAME;
Substitua:
- DB_NAME: o nome do banco de dados do MySQL
- FUNCTION_NAME: o nome da função
Se a função não estiver usando o valor esperado do conjunto de caracteres ou da compilação, talvez seja necessário remover e recriar a função com o novo conjunto de caracteres ou ordenação. Verifique se a função está usando o mapeamento de ordenação do banco de dados correto. Para mais informações sobre como verificar a ordenação do banco de dados, consulte Verificar o mapeamento de ordenação do banco de dados.
I conjunto de caracteres ou ordenação. Verifique se a função está usando o mapeamento de ordenação do banco de dados correto. Para mais informações sobre como verificar a ordenação do banco de dados, consulte Verificar o mapeamento de ordenação do banco de dados.
Determinar o nível de atualizações que será usado
Depois de verificar a configuração do conjunto de caracteres e da ordenação do banco de dados, você terá uma lista de bancos de dados e possivelmente uma lista de objetos de banco de dados que precisam ser atualizadas.
O número de tarefas que você precisará executar depende do tipo dos objetos de banco de dados que exigem mudanças de configuração.
- Execute atualizações no nível do banco de dados. Você só precisa atualizar os metadados do MySQL.
- Realize atualizações no banco de dados e no nível da tabela. Você só precisa atualizar os metadados do MySQL.
- Execute atualizações no nível do banco de dados, da tabela e da coluna. Atualize os metadados e recrie as tabelas e os objetos do banco de dados. Essas atualizações podem levar mais tempo. No entanto, é possível usar um dos exemplos de script fornecidos para atualizar todas as tabelas e colunas em um determinado banco de dados.
Fazer um backup da instância
Antes de fazer qualquer uma dessas atualizações, faça backup da sua instância. Para mais informações, consulte Criar um backup sob demanda. Recomendamos que você faça o backup sem operações DDL em execução na instância.
Gerar comandos de recriação para os objetos armazenados no banco de dados
Se você precisar excluir e recriar objetos de banco de dados armazenados com o novo conjunto de caracteres e ordenação, use a ferramenta mysqldump
para gerar os comandos agora. Depois de atualizar o banco de dados e as colunas da tabela, use o arquivo mysqldump
gerado para recriar os respectivos objetos armazenados no banco de dados. Esse comando gera instruções para todos os procedimentos, funções, gatilhos e eventos armazenados.
Execute o comando a seguir para usar a saída para recriar mais tarde todos os procedimentos, funções e eventos armazenados de um banco de dados específico (quando você recriar objetos de banco 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:
- IP_ADDRESS: endereço IP da instância do Cloud SQL para MySQL
- DB_NAME: o nome do banco de dados do MySQL
Executar atualizações nos bancos de dados e, se necessário, em tabelas e colunas
Nesta etapa, você atualizará os valores do conjunto de caracteres e da ordenação dos bancos de dados. Além disso, talvez seja necessário recriar as tabelas e colunas.
Executar atualizações no nível do banco de dados
Se você for realizar apenas atualizações no nível do banco de dados, execute a próxima instrução para atualizar o banco de dados:
ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Substitua:
- DB_NAME: o nome do banco de dados a ser atualizado
- NEW_CHARSET: o novo conjunto de caracteres a ser aplicado ao banco de dados
- NEW_COLLATION: a nova ordenação a ser aplicada ao banco de dados
Realizar atualizações no banco de dados e no nível da tabela
Se você estiver executando atualizações no nível do banco de dados e da tabela, faça isto:
Execute a instrução a seguir para atualizar o banco de dados:
ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Substitua:
- DB_NAME: o nome do banco de dados a ser atualizado
- NEW_CHARSET: o novo conjunto de caracteres a ser aplicado ao banco de dados
- NEW_COLLATION: a nova ordenação a ser aplicada ao banco de dados
Para cada tabela que você quer atualizar, execute a seguinte instrução:
ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Substitua:
- TABLE_NAME: o nome da tabela a ser atualizada
- NEW_CHARSET: o novo conjunto de caracteres a ser aplicado à tabela
- NEW_COLLATION: a nova ordenação a ser aplicada à tabela
Executar atualizações no nível do banco de dados, da tabela e da coluna
Nesse nível, é necessário codificar novamente os dados existentes para obedecer às novas configurações do conjunto de caracteres e da ordenação. Se você for executar atualizações no nível do banco de dados, da tabela e da coluna, faça isto:
Antes de continuar com as atualizações nas colunas da tabela, analise as seguintes considerações:
- A conversão do conjunto de caracteres e da ordenação
ALTER TABLE
faz com que a tabela seja recriada e bloqueada. Como resultado, qualquer consulta ativa que tente acesso à tabela será bloqueada. - A conversão do conjunto de caracteres e da ordenação
ALTER TABLE
leva tempo porque busca a tabela completa na memória. Essa operação pode aumentar a latência de qualquer carga de trabalho executada em paralelo porque as páginas de pool de buffers serão usadas na tabela atualizada. - Se houver consultas acessando várias tabelas e algumas delas forem atualizadas enquanto outras ainda não foram, as consultas poderão gerar resultados inconsistentes durante o período dessa operação.
- O processo de execução de uma conversão do conjunto de caracteres e da ordenação
ALTER TABLE
cria uma tabela sombra. Portanto, planeje o uso do disco de acordo. - A conversão do conjunto de caracteres e da ordenação
ALTER TABLE
também faz com que todos os índices na tabela sejam recriados. - Não é necessário atualizar separadamente as instâncias de réplica. Os comandos
ALTER
,DROP
eCREATE
são replicados automaticamente. No entanto, a execução de comandos DDL pode aumentar o tempo de atraso da réplica durante a operação. - Se você restaurar qualquer um dos bancos de dados de um backup feito antes de ter aplicado essas atualizações, você precisará aplicá-las novamente.
- A conversão do conjunto de caracteres e da ordenação
Verifique se há tuplas de dados na tabela que possam ser incompatíveis com o novo conjunto de caracteres. Se houver incompatibilidades, será necessário corrigi-las antes de atualizar o conjunto de caracteres. Caso contrário, você verá erros durante o processo de conversão. É possível usar as seguintes opções: instrução
SELECT CONVERT
para validar seus dados com novo 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);
Exemplo de saída:
+------+--------------------------+ | c | convert(c using 'ascii') | +------+--------------------------+ | é | ? | | é | ? | | £ | ? | +------+--------------------------+
Neste exemplo, como a saída retorna essas três tuplas, há três valores inconsistentes que precisam ser corrigidos. Antes de avançar para a próxima etapa, examine a saída da consulta e corrija os dados até que a consulta retorne zero tupla para todas as colunas que precisam de conversão. Também é possível combinar várias colunas na mesma consulta
SELECT
.Escolha uma opção para atualizar o conjunto de caracteres e a ordenação das tabelas no nível da coluna.
Para atualizar o conjunto de caracteres de uma coluna muito específica da tabela, siga as etapas na guia "Nível da coluna", em que você só precisa recodificar colunas selecionadas. Caso contrário, siga as etapas na guia "Nível da tabela", que recodifica a tabela completa.
Tabela
Execute a instrução a seguir para atualizar o banco de dados:
ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Substitua:
- DB_NAME: o nome do banco de dados a ser atualizado
- NEW_CHARSET: o novo conjunto de caracteres a ser aplicado ao banco de dados
- NEW_COLLATION: a nova ordenação a ser aplicada ao banco de dados
Para cada tabela afetada, execute a seguinte instrução para atualizar a tabela:
ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Substitua:
- TABLE_NAME: o nome da tabela a ser atualizada
- NEW_CHARSET: o novo conjunto de caracteres a ser aplicado à tabela
- NEW_COLLATION: a nova ordenação a ser aplicada à tabela
Atualize no nível da tabela para que todas as colunas que fazem parte dela sejam atualizadas com o novo conjunto de caracteres e ordenação. Essa opção recria completamente a tabela. Para usar essa opção, execute a seguinte instrução:
ALTER TABLE DB_NAME.TABLE_NAME CONVERT TO CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Substitua:
- TABLE_NAME: o nome da tabela a ser atualizada
- NEW_CHARSET: o novo conjunto de caracteres a ser aplicado à tabela
- NEW_COLLATION: a nova ordenação a ser aplicada à tabela
Coluna
Atualize no nível da coluna. Essa opção também recria completamente a tabela. Se várias colunas forem atualizadas, essa opção poderá gerar várias recriações.
Para usar essa opção, execute a seguinte instrução:
- Execute a instrução a seguir para atualizar o banco de dados:
- DB_NAME: o nome do banco de dados a ser atualizado
- NEW_CHARSET: o novo conjunto de caracteres a ser aplicado ao banco de dados
- NEW_COLLATION: a nova ordenação a ser aplicada ao banco de dados
- Para cada tabela afetada, execute a seguinte instrução para atualizar a tabela:
- TABLE_NAME: o nome da tabela a ser atualizada
- NEW_CHARSET: o novo conjunto de caracteres a ser aplicado à tabela
- NEW_COLLATION: a nova ordenação a ser aplicada à tabela
- Execute a seguinte instrução para atualizar no nível da coluna:
- DB_NAME: o nome do banco de dados a ser atualizado
- TABLE_NAME: o nome da tabela a ser atualizada
- COLUMN_DEFINITION: especifique uma definição exata da coluna que inclui restrições. A definição da coluna pode conter os valores antigos do conjunto de caracteres e da ordenação. Atualize a definição da coluna com os novos valores.
- NEW_CHARSET: o novo conjunto de caracteres a ser aplicado à coluna da tabela
- NEW_COLLATION: a nova ordenação a ser aplicada à coluna da tabela
ALTER DATABASE DB_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Substitua:
ALTER TABLE TABLE_NAME CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Substitua:
ALTER TABLE DB_NAME.TABLE_NAME MODIFY COLUMN_DEFINITION CHARACTER SET NEW_CHARSET COLLATE NEW_COLLATION;
Substitua:
Repita esta instrução para todas as colunas de string da tabela que precisam de uma atualização do conjunto de caracteres ou da ordenação.
Validar as atualizações e procurar 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 caracteres. Exemplo:
ERROR 1366 (HY000): Incorrect string value: '\xC3\xA9' for column 'c' at row 1
Se você encontrar erros de compatibilidade de dados, recomendamos que verifique novamente se há erros de compatibilidade de dados nas tabelas e corrija-os antes de executar novamente as instruções ALTER TABLE
para recodificar os dados.
Além disso, durante a operação ALTER TABLE
, as tabelas (a tabela de chave externa e a tabela referenciada) podem falhar em uma verificação de chave externa enquanto a coluna é codificada novamente. Se isso acontecer, desative a verificação de chave externa (SET FOREIGN_KEY_CHECKS=0;
) e execute a atualização novamente.
Recriar os objetos de banco de dados armazenados
Depois de atualizar o banco de dados, será possível usar o arquivo mysqldump
gerado para recriar os objetos de banco de dados armazenados com os valores do conjunto de caracteres e da ordenação.
Para recriar os objetos de banco de dados armazenados, faça isto:
- Verifique se os respectivos objetos armazenados estão presentes no banco de dados.
- Verifique se não há uma carga paralela que espere que os objetos de banco de dados armazenados estejam presentes durante esse período de remoção e recriação.
O arquivo
mysqldump
que você gerou com a ferramentamysqldump
não inclui a instrução para remover gatilhos. Se você precisar remover gatilhos, abra um terminal do MySQL para gerar a instruçãoDROP
para gatilhos.mysql> SELECT CONCAT('DROP TRIGGER ', TRIGGER_NAME, ';') AS drop_trigger_statements FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = DB_NAME;
Copie a saída.
Execute a instrução para remover os gatilhos do banco de dados, seja em um shell do MySQL ou em um script.
Depois de remover os gatilhos, aplique o arquivo dump que você gerou com a ferramenta
mysqldump
. Para aplicar o arquivo dump e recriar os objetos, digite isto:$ mysql -uDBAuser -p -h IP_ADDRESS \ -P 3306 DB_NAME < dump_objects.sql
Substitua:
- IP_ADDRESS: endereço IP da instância do Cloud SQL para MySQL
- DB_NAME: o nome do banco de dados
Fazer outro backup da instância
Depois de concluir as atualizações, faça outro backup da instância. Para mais informações, consulte Criar um backup sob demanda.
Scripts de exemplo
Se você precisar atualizar bancos de dados, tabelas e colunas, use os scripts de exemplo nesta seção para ajudar a recodificar seus dados.
Script para atualizar várias tabelas
O script a seguir gera uma instrução para todas as tabelas no banco de dados especificado. Com a instrução, você codificar novamente os dados existentes para obedecer às novas configurações do conjunto de caracteres e da ordenação.
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:
- DB_NAME: o nome do banco de dados a ser atualizado
- NEW_CHARSET: o novo conjunto de caracteres a ser aplicado à tabela
- NEW_COLLATION: a nova ordenação a ser aplicada à 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 em uma tabela
O script a seguir gera uma instrução para todas as colunas em uma determinada tabela. Com a instrução, você codificar novamente os dados existentes para obedecer às novas configurações do conjunto de caracteres e da ordenação.
Gerar instruções
ALTER TABLE
para todas as tabelas no banco de dadosSELECT 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:
- DB_NAME: o nome do banco de dados a ser atualizado
- NEW_CHARSET: o novo conjunto de caracteres a ser aplicado à tabela
- NEW_COLLATION: a nova ordenação a ser aplicada à tabela
Exemplo de saída:
+------------------------------------------------------------------------------+ | alter_table_statements | +------------------------------------------------------------------------------+ | ALTER TABLE test1.t1 CHARACTER SET <new-charset> COLLATE <new-collation>; | +------------------------------------------------------------------------------+
Para cada tabela, gere 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');
Substitua:
- DB_NAME: o nome do banco de dados a ser atualizado
- TABLE_NAME: o nome da tabela a ser atualizada
- COLUMN_DEFINITION: depois de extrair os resultados de cada consulta, substitua pela definição da coluna para cada coluna (as definições das colunas podem variar entre as colunas)
- NEW_CHARSET: o novo conjunto de caracteres a ser aplicado à coluna da tabela
- NEW_COLLATION: a nova ordenação a ser aplicada à 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> | +-------------------------------------------------------------------------------------------------------------------------------------+