Nosso programador anterior definiu o agrupamento errado em uma tabela (Mysql). Ele o configurou com agrupamento em latim, quando deveria ser UTF8, e agora tenho problemas. Todos os discos com caracteres chineses e japoneses passam para ??? personagem.
É possível alterar o agrupamento e recuperar os detalhes do personagem?
Respostas:
alterar agrupamento do banco de dados:
alterar agrupamento da tabela:
alterar o agrupamento da coluna:
O que
utf8mb4_0900_ai_ci
significam as partes ?Mais informações:
fonte
CHARACTER SET utf8
será o padrão parautf8_general_ci
, mas você também pode definir o agrupamento como estaALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_unicode_ci;
se necessáriocreate table testit(a varchar(1)); show create table testit \G drop table testit;
utf8_general_ci
; se você quiser mudá-lo parautf8_unicode_ci
, você pode definir agrupamento:ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
. Isso funciona em tabelas exatamente da mesma forma que em bancos de dados, como o @KCD apontou.ALTER DATABASE <database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
. Você deve fazer o mesmo nas outras duas instruções.Aqui está como alterar todos os bancos de dados / tabelas / colunas. Execute essas consultas e elas produzirão todas as consultas subsequentes necessárias para converter todo o esquema em utf8. Espero que isto ajude!
- Alterar agrupamento padrão do DATABASE
- Alterar TABELA agrupamento / conjunto de caracteres
- Alterar conjunto de agrupamento / conjunto de caracteres COLUMN
fonte
Cuidado que no Mysql, o
utf8
conjunto de caracteres é apenas um subconjunto do conjunto de caracteres UTF8 real. Para salvar um byte de armazenamento, a equipe do Mysql decidiu armazenar apenas três bytes de caracteres UTF8 em vez dos quatro bytes completos. Isso significa que alguns idiomas e emoji do leste asiático não são totalmente suportados. Para garantir que você possa armazenar todos os caracteres UTF8, use outf8mb4
tipo de dados e /utf8mb4_bin
ouutf8mb4_general_ci
no Mysql.fonte
utf8mb4_unicode_ci
vez deutf8mb4_general_ci
. Veja stackoverflow.com/questions/766809/… e drupal.stackexchange.com/questions/166405/…Adicionando ao que David Whittaker postou, criei uma consulta que gera a declaração completa de alteração de tabela e colunas que converterá cada tabela. Pode ser uma boa ideia executar
SET SESSION group_concat_max_len = 100000;
primeiro para garantir que o concat do seu grupo não ultrapasse o limite muito pequeno, como visto aqui .
Uma diferença aqui entre a resposta anterior é que o uso de utf8 em vez de ut8mb4 e o uso de t1.data_type com t1.CHARACTER_MAXIMUM_LENGTH não funcionaram para enumerações. Além disso, minha consulta exclui visualizações, pois elas terão que ser alteradas separadamente.
Eu simplesmente usei um script Perl para retornar todos esses alteradores como uma matriz e iterou sobre eles, corrigi as colunas que eram muito longas (geralmente elas eram varchar (256) quando os dados geralmente tinham apenas 20 caracteres nelas, o que era uma solução fácil )
Encontrei alguns dados corrompidos ao alterar de latin1 -> utf8mb4. Parecia que os caracteres latin1 codificados em utf8 nas colunas seriam enganados na conversão. Simplesmente retive os dados das colunas que sabia que seriam um problema na memória antes e depois da alteração e os comparei e gerei instruções de atualização para corrigir os dados.
fonte
aqui descreve bem o processo. No entanto, alguns dos personagens que não se encaixavam no espaço latino se foram para sempre. UTF-8 é um SUPERSET de latin1. Não é o contrário. A maioria caberá no espaço de byte único, mas nenhum indefinido não (verifique uma lista de latin1 - nem todos os 256 caracteres são definidos, dependendo da definição latin1 do mysql)
fonte