Różnice między utf8 i latin1

128

jaka jest różnica między utf8 a latin1?

binbash
źródło
3
Są to różne kodowania (z niektórymi znakami odwzorowanymi na wspólne sekwencje bajtów, np. Znaki ASCII i wiele liter akcentowanych). UTF-8 to jedno kodowanie Unicode ze wszystkimi jego punktami kodowymi; Latin1 koduje mniej niż 256 znaków.
ShreevatsaR
Istnieje również latin9, który jest dostępny w lokalizacjach Linuksa i można go było wspomnieć w pytaniu: en.wikipedia.org/wiki/ISO/IEC_8859-15
baptx

Odpowiedzi:

151

UTF-8 jest przygotowany do dominacji nad światem, Latin1 nie.

Jeśli próbujesz zapisać znaki spoza alfabetu łacińskiego, takie jak chiński, japoński, hebrajski, rosyjski itp., Używając kodowania Latin1 , zostaną one ostatecznie oznaczone jako mojibake . Tekst wprowadzający do tego artykułu może okazać się przydatny (a nawet bardziej, jeśli znasz trochę Javę).

Zwróć uwagę, że pełna obsługa 4-bajtowego UTF-8 została wprowadzona tylko w MySQL 5.5. Przed tą wersją tylko 3 bajty na znak, a nie 4 bajty na znak. Obsługuje więc tylko płaszczyznę BMP, a nie np. Płaszczyznę Emoji. Jeśli chcesz mieć pełną obsługę 4-bajtowego UTF-8, zaktualizuj MySQL do co najmniej 5.5 lub wybierz inny RDBMS, taki jak PostgreSQL. W MySQL 5.5+ nazywa się utf8mb4.

BalusC
źródło
31
MySQL 5.1 obsługuje 3-bajtowe UTF-8, jednak Mysql 5.5 obsługuje 4-bajtowe UTF-8 jako utf8mb4.
velcrow
2
@BalusC Czy możesz wyjaśnić, dlaczego UTF-8 nie jest w pełni obsługiwany? Czy to oznacza, że ​​MySQL 5.1 nie może przechowywać wszystkich znaków Unicode?
Pacerier,
2
@Pacerier: obsługuje tylko 3 bajty na znak, więc obsługiwany jest tylko BMP (pierwsze 65535 znaków), a reszta nie. Wszystkie postacie można znaleźć na stronie en.wikipedia.org/wiki/Plane_(Unicode)
BalusC
2
@BalusC Jeśli chodzi o osoby używające 5.1.63 i nie mające uprawnień do aktualizowania wersji mysql serwera WWW, jakie mogą być alternatywy?
Pacerier,
6
@Pacerier: Możesz zapisać jako VARBINARYzamiast VARCHARi samodzielnie dekodować / zakodować w warstwie biznesowej, ale to jest hack. Rozważ zadanie nowego pytania, może są lepsze sposoby.
BalusC
47

W latin1 każdy znak ma dokładnie jeden bajt. W utf8 znak może składać się z więcej niż jednego bajtu. W konsekwencji utf8 ma więcej znaków niż latin1 (a wspólne znaki nie muszą być reprezentowane przez ten sam bajt / kolejność bajtów).

sepp2k
źródło
1
A co z ascii i bin?
Yousha Aleayoub
8
@YoushaAleayoub ASCII to kodowanie jednobajtowe, które wykorzystuje znaki od 0 do 127, dzięki czemu może zakodować połowę mniej znaków niż latin1. Jest to ścisły podzbiór zarówno latin1, jak i utf8, co oznacza, że ​​bajty od 0 do 127 zarówno w latin1, jak i utf8 kodują to samo, co w ASCII. Bin nie jest kodowaniem. Zwykle jest to opcja, którą możesz podać podczas czytania pliku, mówiąc funkcjom IO, aby nie stosowały żadnego kodowania, ale zamiast tego po prostu czytały plik bajt po bajcie.
sepp2k
1
dzięki, miałem na myśli binarysortowanie ...? a który jest lepszy dla pól angielskich / numerycznych: ascii_general_cilub ascii_bin?
Yousha Aleayoub