Diferenças entre utf8 e latin1


128

qual é a diferença entre utf8 e latin1?


3
São codificações diferentes (com alguns caracteres mapeados para seqüências de bytes comuns, por exemplo, os caracteres ASCII e muitas letras acentuadas). UTF-8 é uma codificação de Unicode com todos os seus pontos de código; Latin1 codifica menos de 256 caracteres.
precisa saber é o seguinte

Também existe latin9, que está disponível nos códigos de idioma do Linux e poderia ter sido mencionado na pergunta: en.wikipedia.org/wiki/ISO/IEC_8859-15
baptx

Respostas:


151

O UTF-8 está preparado para dominar o mundo, o Latin1 não.

Se você estiver tentando armazenar caracteres não latinos, como chinês, japonês, hebraico, russo, etc, usando a codificação Latin1, eles acabarão como mojibake . Você pode achar útil o texto introdutório deste artigo (e ainda mais se conhecer um pouco de Java).

Observe que o suporte completo a UTF-8 de 4 bytes foi introduzido apenas no MySQL 5.5. Antes dessa versão, ele só subia até 3 bytes por caractere, não 4 bytes por caractere. Portanto, ele suportava apenas o plano BMP e não, por exemplo, o plano Emoji. Se você deseja suporte completo a UTF-8 de 4 bytes, atualize o MySQL para pelo menos 5,5 ou opte por outro RDBMS como o PostgreSQL. No MySQL 5.5+ é chamado utf8mb4.


31
O Mysql 5.1 suporta UTF-8 de 3 bytes, no entanto o Mysql 5.5 suporta UTF-8 de 4 bytes como utf8mb4.
Velcrow

2
@BalusC Você pode elaborar mais sobre como o UTF-8 não é totalmente suportado? Isso significa que o Mysql 5.1 não pode armazenar todos os caracteres unicode?
Pacerier

2
@Pacerier: suporta apenas 3 bytes por caractere; portanto, apenas o BMP (os primeiros 65535 caracteres) é suportado, o restante não. Para todos os caracteres, consulte en.wikipedia.org/wiki/Plane_(Unicode)
BalusC 12/12

2
@BalusC Quanto às pessoas que usam o 5.1.63 e não têm o privilégio de atualizar a versão mysql do servidor web, quais podem ser as alternativas?
Pacerier 12/06

6
@ Pacerier: Você pode salvar como em VARBINARYvez de VARCHARe decodificar / codificar na camada de negócios, mas isso é hacky. Considere fazer uma nova pergunta, talvez haja maneiras melhores.
BalusC

47

Em latin1, cada caractere tem exatamente um byte de comprimento. No utf8, um caractere pode consistir em mais de um byte. Consequentemente, utf8 tem mais caracteres que latin1 (e os caracteres que eles têm em comum não são necessariamente representados pela mesma sequência de bytes / bytes).


1
E quanto a ascii e bin?
Yousha Aleayoub

8
@YoushaAleayoub ASCII é uma codificação de byte único que usa os caracteres de 0 a 127, para que ele possa codificar metade do número de caracteres latin1. É um subconjunto estrito de latin1 e utf8, significando que os bytes de 0 a 127 em latin1 e utf8 codificam as mesmas coisas que no ASCII. Bin não é uma codificação. Geralmente, é uma opção que você pode oferecer ao ler um arquivo, dizendo às funções de E / S para não aplicar nenhuma codificação, mas, em vez disso, basta ler o arquivo byte a byte.
sepp2k

1
obrigado, eu quis dizer binaryagrupar ...? e qual é o melhor para campos numéricos / inglês: ascii_general_ciou ascii_bin?
Yousha Aleayoub
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.