Различия между utf8 и latin1

129

в чем разница между utf8 и latin1?

Бинбаш
источник
3
Это разные кодировки (с некоторыми символами, сопоставленными с общими последовательностями байтов, например, символы ASCII и многие буквы с диакритическими знаками). UTF-8 - это одна кодировка Unicode со всеми его кодовыми точками; Latin1 кодирует менее 256 символов.
ShreevatsaR
Существует также latin9, который доступен в локали Linux и мог быть упомянут в вопросе: en.wikipedia.org/wiki/ISO/IEC_8859-15
baptx

Ответы:

152

UTF-8 подготовлен к мировому господству, Latin1 - нет.

Если вы пытаетесь сохранить нелатинские символы, такие как китайский, японский, иврит, русский и т. Д., Используя кодировку Latin1, то они останутся моджибаке . Вы можете найти вводный текст этой статьи полезным (и даже больше, если вы немного знаете Java).

Обратите внимание, что полная поддержка 4-байтового UTF-8 была введена только в MySQL 5.5. До этой версии он занимал до 3 байтов на символ, а не 4 байта на символ. Таким образом, он поддерживал только самолет BMP, а не, например, самолет Emoji. Если вам нужна полная поддержка 4-байтового UTF-8, обновите MySQL до версии не ниже 5.5 или перейдите на другую СУБД, например PostgreSQL. В MySQL 5.5+ это называется utf8mb4.

BalusC
источник
31
Mysql 5.1 поддерживает 3-байтовый UTF-8, однако Mysql 5.5 поддерживает 4-байтовый UTF-8 как utf8mb4.
velcrow
2
@BalusC Не могли бы вы подробнее рассказать о том, что UTF-8 не полностью поддерживается? Означает ли это, что Mysql 5.1 не может хранить все символы Юникода?
Pacerier
2
@Pacerier: он поддерживает только 3 байта на символ, поэтому поддерживается только BMP (первые 65535 символов), а остаток - нет. Информацию обо всех персонажах см. На en.wikipedia.org/wiki/Plane_(Unicode)
BalusC
2
@BalusC Что касается людей, использующих 5.1.63 и не имеющих права обновлять версию mysql веб-сервера, какие могут быть альтернативы?
Pacerier
6
@Pacerier: вы можете сохранить как VARBINARYвместо VARCHARи самостоятельно декодировать / кодировать на бизнес-уровне, но это взломано. Попробуйте задать новый вопрос, возможно, есть способы получше.
BalusC
48

В latin1 длина каждого символа составляет ровно один байт. В utf8 символ может состоять из более чем одного байта. Следовательно, utf8 имеет больше символов, чем latin1 (и символы, которые у них есть общие, не обязательно представлены одной и той же байтовой / байтовой последовательностью).

sepp2k
источник
1
А как насчет ascii и bin?
Юша Алеайуб
8
@YoushaAleayoub ASCII - это однобайтовая кодировка, в которой используются символы от 0 до 127, поэтому она может кодировать вдвое меньше символов, чем latin1. Это строгое подмножество как latin1, так и utf8, что означает, что байты с 0 по 127 как в latin1, так и в utf8 кодируют те же вещи, что и в ASCII. Bin - это не кодировка. Обычно это опция, которую вы можете указать при чтении файла, указав функциям ввода-вывода не применять никакой кодировки, а вместо этого просто читать файл побайтно.
sepp2k
1
спасибо, я имел ввиду binaryсопоставить ...? и какой из них лучше для английских / числовых полей: ascii_general_ciили ascii_bin?
Юша Алеайуб