Différences entre utf8 et latin1

128

quelle est la difference entre utf8 et latin1?

binbash
la source
3
Ce sont des encodages différents (avec certains caractères mappés sur des séquences d'octets communes, par exemple les caractères ASCII et de nombreuses lettres accentuées). UTF-8 est un encodage d'Unicode avec tous ses points de code; Latin1 code moins de 256 caractères.
ShreevatsaR
Il y a aussi latin9 qui est disponible dans les locales Linux et qui aurait pu être mentionné dans la question: en.wikipedia.org/wiki/ISO/IEC_8859-15
baptx le

Réponses:

151

UTF-8 est prêt pour la domination mondiale, pas Latin1 .

Si vous essayez de stocker des caractères non latins comme le chinois, le japonais, l'hébreu, le russe, etc. en utilisant le codage Latin1, ils finiront par être du mojibake . Vous trouverez peut-être le texte d'introduction de cet article utile (et encore plus si vous connaissez un peu Java).

Notez que la prise en charge complète de 4 octets UTF-8 n'a été introduite que dans MySQL 5.5. Avant cette version, il ne va que jusqu'à 3 octets par caractère, pas 4 octets par caractère. Donc, il ne supportait que le plan BMP et pas par exemple le plan Emoji. Si vous voulez un support UTF-8 complet sur 4 octets, mettez à niveau MySQL vers au moins 5.5 ou optez pour un autre SGBDR comme PostgreSQL. Dans MySQL 5.5+, il s'appelle utf8mb4.

BalusC
la source
31
Mysql 5.1 prend en charge 3 octets UTF-8, cependant Mysql 5.5 prend en charge 4 octets UTF-8 comme utf8mb4.
velcrow
2
@BalusC Pouvez-vous expliquer plus en détail comment UTF-8 n'est pas entièrement pris en charge? Cela signifie-t-il que Mysql 5.1 ne peut pas stocker tous les caractères Unicode?
Pacerier
2
@Pacerier: il ne prend en charge que 3 octets par caractère, donc seul le BMP (les 65535 premiers caractères) est pris en charge, le reste non. Pour tous les personnages, voir en.wikipedia.org/wiki/Plane_(Unicode)
BalusC
2
@BalusC Quant aux personnes utilisant la version 5.1.63 et n'ayant pas le privilège de mettre à jour la version mysql du serveur Web, quelles peuvent être les alternatives?
Pacerier
6
@Pacerier: Vous pouvez enregistrer vous-même sous VARBINARYau lieu de VARCHARet décoder / encoder dans le niveau métier, mais c'est piraté. Pensez à poser une nouvelle question, il existe peut-être de meilleures façons.
BalusC
47

En latin1, chaque caractère mesure exactement un octet. Dans utf8, un caractère peut être composé de plus d'un octet. Par conséquent, utf8 a plus de caractères que latin1 (et les caractères qu'ils ont en commun ne sont pas nécessairement représentés par la même séquence d'octet / d'octet).

sepp2k
la source
1
Qu'en est-il de l'ascii et du bin?
Yousha Aleayoub
8
@YoushaAleayoub ASCII est un encodage à un octet qui utilise les caractères 0 à 127, il peut donc encoder deux fois moins de caractères que latin1. C'est un sous-ensemble strict de latin1 et utf8, ce qui signifie que les octets 0 à 127 en latin1 et utf8 codent les mêmes choses qu'en ASCII. Bin n'est pas un encodage. C'est généralement une option que vous pouvez donner lors de la lecture d'un fichier, en disant aux fonctions IO de ne pas appliquer de codage, mais de simplement lire le fichier octet par octet.
sepp2k
1
merci, je voulais dire binaryrassembler ...? et lequel est le meilleur pour les champs anglais / numériques: ascii_general_ciou ascii_bin?
Yousha Aleayoub