Skip to content

Instantly share code, notes, and snippets.

@emiliojva
Last active April 6, 2019 19:55
Show Gist options
  • Save emiliojva/8570ffcc816f8c1309375d767e558ef7 to your computer and use it in GitHub Desktop.
Save emiliojva/8570ffcc816f8c1309375d767e558ef7 to your computer and use it in GitHub Desktop.
História da codificação utf8mb4
Antigamente as linguagens de programação suportavam apenas a codificação ASCII que define 128 símbolos. Essa codificação é excelente para o inglês, produzindo textos bem compactos onde cada letra gasta apenas um byte. Com o crescimento da internet e um mundo cada vez mais globalizado, rapidamente começaram a surgir problemas, como as pessoas do Brasil não poderem usar acentos em suas palavras. Foi aí que começaram iniciativas para se criar uma codificação que reunisse todos os símbolos usados pelo mundo inteiro.
O ASCII só define 128 símbolos, o que faz com que o primeiro bit de todo byte seja zero nessa codificação. O padrão UTF-8 aproveitou isso e definiu os primeiros 128 símbolos exatamente iguais ao ASCII. Quando um caractere que não está presente nesse padrão é necessário, o UTF-8 coloca o valor do primeiro bit como 1 e define códigos que dizem se o caractere vai ter 1, 2, 3 ou 4 bytes. Portanto um programa que utilize UTF-8 terá compatibilidade total com qualquer texto em ASCII.
O problema é que o MySQL não aderiu completamente ao padrão UTF-8. Ele implementou apenas símbolos de até 3 bytes e esqueceu o resto. O que se declara no MySQL como utf8 na verdade não é UTF-8, é apenas um pedaço dele. Para consertar este erro, a partir da versão 5.5, o MySQL implementou o padrão completo indo de 1 até 4 bytes e como já havia usado o nome utf8 chamou sua nova implementação de utf8mb4. Resumindo o utf8 do MySQL não é UTF-8 e o utf8mb4 segue totalmente o padrão UTF-8.
Ainda assim, o utf8 e o utf8mb4 tem uma grande compatibilidade, a maioria absoluta dos caracteres vão ser iguais nos dois sistemas. Se você trocar de um para o outro provavelmente não vai ver diferença. A não ser é claro, que pessoas chinesas comecem a usar animais como letras, aí eles vão ficar chateados quando aparecer #û&ý no lugar dos gatinhos. Mesmo que você utilize todos os acentos existentes não daria nenhum problema!
A questão é que, o padrão do MySQL é a codificação Latin1, também conhecida como ISO 8859-1 que define todos os caracteres da língua latina e pode ser muito bem utilizada no português. Quando você deixou de declarar UTF-8mb4, o MySQL utilizou essa codificação e como sua aplicação está provavelmente em UTF-8 esses padrões não representam os acentos da mesma maneira, mas representam ASCII da mesma forma, por isso o erro aparece só nos acentos.
Talvez essa parte do script deu errado pois a versão do MySQL usada não suporta utf8mb4. Se esse for o caso é só utilizar o utf8 no lugar, que os acentos serão compatíveis.
referencia: https://pt.stackoverflow.com/questions/124831/quais-as-diferen%C3%A7as-entre-utf8-e-utf8mb4
Comando para alterar a tabela :
-> ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment