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;
5.5 e 5.6 tiveram o problema 191. 5.7 resolveu o problema.
Veja isto para discussão de várias soluções alternativas em 5.5/5.6. Ambos os artigos que você faz referência são datados, pois discutem 5.5. (Note que eu já comentei sobre ambos.)
Eu recomendo que você mude
255
para algum limite razoável para cada coluna, de qualquer maneira.Uma ressalva com
ALTER .. CONVERT TO ..
- Secountry_code
fosse o que deveria ser, ou sejaCHARACTER SET ascii
; oALTER
mudaria parautf8mb4
.Q2...
O
CHARSET
de uma coluna é importante. O valorCHARSET
de uma tabela é apenas o padrão para as colunas. Idem para o banco de dados e qualquer tabela recém-criada.Prefiro não depender desse padrão e declaro explicitamente o
CHARSET
em qualquer tabela ICREATE
. Outros podem preferir fazer umALTER DATABASE
.