Подтвердить что ты не робот

Utf-8 vs latin1

Каковы преимущества/недостатки использования utf8 в качестве кодировки против использования latin1?

Если utf может поддерживать большее количество символов и используется последовательно, не всегда ли это лучший выбор? Есть ли причина выбора latin1?

4b9b3361

Ответ 1

latin1 имеет то преимущество, что он является однобайтовой кодировкой, поэтому он может хранить больше символов в одном и том же объеме пространства памяти, потому что длина строковых типов данных в MySql зависит от кодировки. В руководстве указано, что

Чтобы вычислить количество байтов, используемых для хранения определенного CHAR, VARCHAR или TEXT, вы должны учитывать набор символов, используемый для этого столбца, и содержит ли это значение многобайтные символы. В частности, при использовании utf8 (или utf8mb4) Набор символов в Юникоде, вы должны помнить, что не все символы использовать одинаковое количество байтов и может потребовать до трех (четырех) байтов за символ. Для разбивки хранилища, используемого для разных категории символов utf8 или utf8mb4, см. раздел 10.1.10, "Поддержка Unicode".

Кроме того, много строковых операций (например, подстановки и сопоставимые сравнения) быстрее с однобайтовыми кодировками.

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

Ответ 2

UTF8 Преимущества:

  • Поддерживает большинство языков, включая языки RTL, такие как иврит.

  • Не требуется перевода при импорте/экспорте данных в компоненты, поддерживающие UTF8 (JavaScript, Java и т.д.).

UTF8 Недостатки:

  • Не-ASCII-символы занимают больше времени для кодирования и декодирования из-за их более сложной схемы кодирования.

  • Символы, отличные от ASCII, занимают больше места, поскольку они могут быть сохранены с использованием более 1 байта (символы не входят в первые 127 символов набора символов ASCII). Для поля A CHAR(10) или VARCHAR(10) может потребоваться до 30 байтов для хранения некоторых символов UTF8.

  • Коллации, отличные от utf8_bin, будут медленнее, так как порядок сортировки не будет непосредственно отображаться в порядке кодировки символов), и для этого потребуется перевод в некоторых хранимых процедурах (в качестве переменных по умолчанию для utf8_general_ci).

  • Если вам нужны поля JOIN UTF8 и не-UTF8, MySQL наложит сильный удар по производительности. То, что было бы второстепенными запросами, могло бы занять минуты, если скрепленные поля являются разными наборами символов/сопоставлениями.

Нижняя строка:

Если вам не нужно поддерживать языки без латинского языка, вы хотите достичь максимальной производительности или уже используете таблицы с помощью latin1, выберите latin1.

В противном случае выберите UTF8.

Ответ 3

@Ross Smith II, пункт 4 стоит золота, что означает несогласованность между столбцами, может быть опасно.

Чтобы добавить значение к уже хорошим ответам, вот небольшой тест производительности разницы между кодировками:

Современный сервер 2013 года, таблица реального использования с 20000 строками, без индекса в соответствующем столбце.

SELECT 4 FROM subscribers ГДЕ 1 ЗАКАЗ BY time_utc_str; (4 - кеш-биттер)

  • varchar (20) CHARACTER SET latin1 COLLATION latin1_bin: 15ms
  • varbinary (20): 17ms
  • utf8_bin: 20ms
  • utf8_general_ci: 23ms

Для простых строк, таких как числовые даты, мое решение было бы при использовании производительности использовать utf8_bin (CHARACTER SET utf8 COLLATE utf8_bin). Это предотвратило бы любые неблагоприятные эффекты с другим кодом, который ожидает, что кодировки базы данных будут utf8, хотя все еще являются своего рода двоичным.

Ответ 4

Кодировки фиксированной длины, такие как латинский-1, всегда более эффективны с точки зрения потребления ЦП.

Если набор токенов в некотором наборе символов фиксированной длины, как известно, достаточен для вашей цели, и ваша цель связана с интенсивной и интенсивной обработкой строк, с большим количеством файлов LENGTH() и SUBSTR(), тогда может быть хорошей причиной не использовать кодировки, такие как UTF-8.

О, и BTW. Не путайте, как вам кажется, между набором символов и кодировкой. Набор символов - это определенный набор записываемых глифов. Один и тот же набор символов может иметь несколько различных кодировок. Различные версии стандарта Юникода представляют собой набор символов. Каждый из них может быть подвергнут либо UTF-8, UTF-16 и "UTF-32" (не официальное название, а относится к идее использования полного четырех байтов для любого символа), а два последних могут каждый приходят в HOB-first или HOB-последний аромат.