Відмінності між utf8 та latin1


128

яка різниця між utf8 та latin1?


3
Вони різні кодування (з деякими символами, відображеними на загальні послідовності байтів, наприклад, символи ASCII та багато букв з акцентами). UTF-8 - це одне кодування Unicode з усіма його кодовими точками; Latin1 кодує менше 256 символів.
ShreevatsaR

Також є latin9, який доступний у
мовах

Відповіді:


151

UTF-8 готується до світового панування, Latin1 - ні.

Якщо ви намагаєтесь зберігати не латинські символи, такі як китайський, японський, іврит, російська та ін., Використовуючи кодування Latin1, вони в кінцевому підсумку стануть mojibake . Вступний текст цієї статті вам може бути корисним (і навіть більше, якщо ви трохи знаєте Java).

Зауважте, що повна 4-байтова підтримка UTF-8 була представлена ​​лише в MySQL 5.5. Перед цією версією вона містить до 3 байт на символ, а не 4 байти на символ. Отже, він підтримував лише площину BMP, а не, наприклад, площину Emoji. Якщо ви хочете повну 4-байтну підтримку UTF-8, оновіть MySQL принаймні до 5,5 або перейдіть до іншої RDBMS, наприклад PostgreSQL. У MySQL 5.5+ це називається utf8mb4.


31
Mysql 5.1 підтримує 3-байтний UTF-8, проте Mysql 5.5 підтримує 4-байтний UTF-8 як utf8mb4.
velcrow

2
@BalusC Чи можете ви детальніше розповісти про те, як UTF-8 не підтримується повністю? Чи означає це, що Mysql 5.1 не може зберігати всі символи unicode?
Pacerier

2
@Pacerier: він підтримує лише 3 байти на символ, таким чином підтримується лише BMP (перші 65535 символів), залишок - ні. Про всіх персонажів див.
En.wikipedia.org/wiki/Plane_(Unicode

2
@BalusC Що стосується людей, які використовують 5.1.63 і не мають привілею оновлювати версію mysql веб-сервера, які можуть бути альтернативи?
Pacerier

6
@Pacerier: Ви можете зберегти як VARBINARYзамість, так VARCHARі розшифрувати / кодувати у бізнес-рівні самостійно, але це хакі. Подумайте, задавши нове запитання, можливо, є кращі способи.
BalusC

47

У латині1 кожен символ має рівно один байт. У utf8 символ може складатися з декількох байт. Отже, utf8 має більше символів, ніж latin1 (а символи, які вони мають спільно, не обов'язково представлені тим самим байтом / побічним наслідком).


1
А як щодо ascii та bin?
Yousha Aleayoub

8
@YoushaAleayoub ASCII - це однобайтове кодування, в якому використовуються символи від 0 до 127, тому він може кодувати вдвічі більше символів, ніж latin1. Це суворий підмножина як latin1, так і utf8, тобто байти від 0 до 127 як у latin1, так і у utf8 кодують ті самі речі, що і в ASCII. Бін - не кодування. Зазвичай це варіант, який ви можете дати, читаючи файл, кажучи функціям IO, щоб не застосовувати жодне кодування, а натомість просто читати байт файлу за байтом.
sepp2k

1
дякую, я мав на увазі binaryпорівнювати ...? а який краще для англійських / числових полів: ascii_general_ciабо ascii_bin?
Yousha Aleayoub
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.