Eu tentei as seguintes etapas para atualizar o CHARSET para utf8mb4 e conectá-lo ao servidor de back-end existente.
usuários ALTER TABLE CONVERTER PARA CONJUNTO DE CARACTERES utf8mb4 COLLATE utf8mb4_unicode_ci;
atualize os parâmetros de conexão do banco de dados.
"user:pass@tcp(server:3306)/mydbcharset=utf8mb4&collation=utf8mb4_unicode_ci"
Este é o esquema da tabela de usuários antes da migração.
CREATE TABLE IF NOT EXISTS `users` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`email` VARCHAR(255) NOT NULL DEFAULT '',
`password` VARCHAR(255) NOT NULL DEFAULT '',
`country_code` CHAR(4) NOT NULL DEFAULT '',
`industry` VARCHAR(255) NOT NULL DEFAULT '',
`company_size` VARCHAR(255) NOT NULL DEFAULT '',
`company_name` VARCHAR(255) NOT NULL DEFAULT '',
`last_name` VARCHAR(255) NOT NULL DEFAULT '',
`first_name` VARCHAR(255) NOT NULL DEFAULT '',
`newsletter` TINYINT(1) NOT NULL DEFAULT 0,
`company_website` VARCHAR(255) NOT NULL DEFAULT '',
`job_title` VARCHAR(255) NOT NULL DEFAULT '',
`profile_picture` VARCHAR(255) NOT NULL DEFAULT '',
`verified` TINYINT(1) NOT NULL DEFAULT 0,
`p_updated_time` INT NOT NULL DEFAULT 0,
`created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY (`email`)
)ENGINE = InnoDB DEFAULT CHARSET=UTF8;
Tudo funciona bem até agora.
Minha preocupação é que algumas das colunas VARCHAR tenham restrição de caracteres como 255. Neste artigo https://mathiasbynens.be/notes/mysql-utf8mb4 e a resposta aceita aqui Como converter facilmente tabelas utf8 para utf8mb4 no MySQL 5.5 diz atualizar varchar (255) a 191 é necessário. No entanto, não encontrei problemas sem fazer isso, o banco de dados existente tem cerca de 100 registros de usuário e uma simulação da migração acima funcionou perfeitamente.
Pergunta são
- É obrigatório verificar e atualizar os comprimentos das colunas ao passar de utf8 para utf8mb4, caso contrário, que tipo de problemas podem surgir?
- Também é obrigatório alterar o CHARSET da base de dados? Por que não mudar apenas o charset da tabela?
-- ATUALIZAÇÃO --
Para alguém que se depara com violações de chave estrangeira pode usar o abaixo
SET FOREIGN_KEY_CHECKS=0;
-- Insert your other SQL Queries here...
ALTER TABLE tble_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SET FOREIGN_KEY_CHECKS=1;