Unterschiede zwischen utf8 und latin1

128

Was ist der Unterschied zwischen utf8 und latin1?

binbash
quelle
3
Es handelt sich um unterschiedliche Codierungen (wobei einige Zeichen gemeinsamen Byte-Sequenzen zugeordnet sind, z. B. die ASCII-Zeichen und viele Buchstaben mit Akzent). UTF-8 ist eine Codierung von Unicode mit all seinen Codepunkten. Latin1 codiert weniger als 256 Zeichen.
ShreevatsaR
Es gibt auch latin9, das in Linux-Gebietsschemas verfügbar ist und in der Frage erwähnt werden könnte: en.wikipedia.org/wiki/ISO/IEC_8859-15
Taufe

Antworten:

151

UTF-8 ist auf die Weltherrschaft vorbereitet, Latin1 nicht.

Wenn Sie versuchen, nicht-lateinische Zeichen wie Chinesisch, Japanisch, Hebräisch, Russisch usw. mit Latin1-Codierung zu speichern, werden sie als Mojibake angezeigt . Möglicherweise finden Sie den Einführungstext dieses Artikels hilfreich (und noch mehr, wenn Sie ein bisschen Java kennen).

Beachten Sie, dass die vollständige 4-Byte-UTF-8-Unterstützung nur in MySQL 5.5 eingeführt wurde. Vor dieser Version sind es nur bis zu 3 Bytes pro Zeichen, nicht bis zu 4 Bytes pro Zeichen. Es wurde also nur die BMP-Ebene unterstützt und nicht z. B. die Emoji-Ebene. Wenn Sie eine vollständige 4-Byte-UTF-8-Unterstützung wünschen, aktualisieren Sie MySQL auf mindestens 5,5 oder wählen Sie ein anderes RDBMS wie PostgreSQL. In MySQL 5.5+ heißt es utf8mb4.

BalusC
quelle
31
MySQL 5.1 unterstützt 3-Byte-UTF-8, MySQL 5.5 unterstützt jedoch 4-Byte-UTF-8 als utf8mb4.
Velcrow
2
@BalusC Können Sie näher erläutern, wie UTF-8 nicht vollständig unterstützt wird? Bedeutet das, dass MySQL 5.1 nicht alle Unicode-Zeichen speichern kann ?
Pacerier
2
@Pacerier: Es werden nur 3 Bytes pro Zeichen unterstützt, daher wird nur das BMP (die ersten 65535 Zeichen) unterstützt, der Rest nicht. Für alle Charaktere siehe en.wikipedia.org/wiki/Plane_(Unicode)
BalusC
2
@BalusC Was sind die Alternativen für Benutzer von 5.1.63, die nicht die Berechtigung haben, die MySQL-Version des Webservers zu aktualisieren?
Pacerier
6
@Pacerier: Sie könnten als speichern VARBINARYstatt VARCHARund dekodieren / kodieren in dem Business - Tiere selbst, aber dies ist Hacky. Stellen Sie eine neue Frage, vielleicht gibt es bessere Möglichkeiten.
BalusC
47

In latin1 ist jedes Zeichen genau ein Byte lang. In utf8 kann ein Zeichen aus mehr als einem Byte bestehen. Folglich hat utf8 mehr Zeichen als latin1 (und die Zeichen, die sie gemeinsam haben, werden nicht unbedingt durch dasselbe Byte / dieselbe Bytequenz dargestellt).

sepp2k
quelle
1
Was ist mit ASCII und Bin?
Yousha Aleayoub
8
@YoushaAleayoub ASCII ist eine Einzelbyte-Codierung, die die Zeichen 0 bis 127 verwendet, sodass halb so viele Zeichen wie latin1 codiert werden können. Es ist eine strikte Teilmenge von latin1 und utf8, dh die Bytes 0 bis 127 in latin1 und utf8 codieren dieselben Dinge wie in ASCII. Bin ist keine Kodierung. Dies ist normalerweise eine Option, die Sie beim Lesen einer Datei angeben können, indem Sie die E / A-Funktionen anweisen, keine Codierung anzuwenden, sondern die Datei nur byteweise zu lesen.
sepp2k
1
danke, ich meinte binaryzusammenstellen ...? und welches ist besser für englisch / numerische Felder: ascii_general_cioder ascii_bin?
Yousha Aleayoub