Когда использовать utf-8 и когда использовать latin1 в MySQL?

Я знаю, что MySQL имеет по умолчанию кодировку latin1 и, по-видимому, занимает 1 байт, чтобы сохранить символ в latin1 и 3 байта для хранения символа в utf-8 - это правильно?

Я работаю над сайтом, который, я надеюсь, будет использоваться во всем мире. Нужно ли вообще иметь utf-8? Или я смогу уйти с использованием latin1?

Кроме того, я попытался изменить некоторые таблицы с latin1 на utf8, но я получил эту ошибку: Speficief key was too long; max key length is 1000 bytes Кто-нибудь знает решение этого? И должен ли я действительно решить это или может быть достаточно латинского?

Спасибо, Alex

Ответ 1

для сохранения символа в latin1 и 3 байта для хранения символа в utf-8 требуется 1 байт - это правильно?

Для хранения символа latin1 и 1 до 3 для хранения символа UTF8 требуется 1).

Если вы используете только основные латинские символы и знаки препинания в своих строках (от 0 до 128 в Unicode), обе кодировки будут иметь одинаковую длину.

Кроме того, я попытался изменить некоторые таблицы с latin1 на utf8, но я получил эту ошибку: "Speficief key был слишком длинным, максимальная длина ключа - 1000 байт" Кто-нибудь знает решение этого? И должен ли я действительно решить это или может быть достаточно латинского?

Если у вас есть столбец VARCHAR(334) или дольше, MyISAM не позволит вам создать индекс на нем, так как существует возможность удаленного столбца, чтобы занять больше 1000 байт.

Обратите внимание, что ключи такой длины редко используются. Вы можете создать префиксный индекс, который будет почти таким же избирательным для любых реальных данных.

Ответ 2

Как минимум, я бы предложил использовать UTF-8. Ваши данные теперь будут совместимы с любой другой базой данных, так как 90% + являются UTF-8.

Если вы идете с LATIN1/ISO-8859-1, вы рискуете неправильно хранить данные, потому что они не поддерживают международные символы... поэтому вы можете столкнуться с чем-то вроде левой стороны этого изображения:

enter image description here

Если вы идете с UTF-8, вам не нужно иметь дело с этими головными болями.

Что касается вашей ошибки, похоже, вам нужно оптимизировать вашу базу данных. Рассмотрим это: http://bugs.mysql.com/bug.php?id=4541#c284415

Это поможет, если вы указали спецификацию в своей схеме и столбце таблицы для этой проблемы.

Ответ 3

Если вы разрешаете пользователям размещать на своих языках, и если вы хотите, чтобы пользователи из всех стран участвовали, вам нужно переключить, по крайней мере, таблицы, содержащие эти сообщения, на UTF-8. Latin1 охватывает только символы ASCII и западноевропейские символы. То же самое верно, если вы намерены использовать несколько языков для своего пользовательского интерфейса. См. этот пост для обработки миграции.

Ответ 4

По моему опыту, если вы планируете поддерживать арабский, русский, азиатский языки или другие, инвестиции в поддержку UTF-8 авансом будут окупаться. Однако, в зависимости от ваших обстоятельств, вы можете уйти с английским языком некоторое время.

Что касается ошибки, у вас, вероятно, есть поле ключа или индекса с более чем 333 символами, максимально допустимое в MySQL с кодировкой UTF-8. См. Этот отчет отчет об ошибках.

Ответ 5

Поскольку максимальная длина ключа составляет 1000 BYTES, если вы используете utf8, тогда это ограничит вас 333 символами.

Однако MySQL отличается от Oracle для кодировки. В Oracle у вас не может быть другого набора символов для каждого столбца, если вы используете MySQL, так что вы можете установить ключ для latin1 и других столбцов в utf8.

Наконец, я считаю, что только несуществующая версия 6.0alpha (отброшенная, когда Sun купила MySQL) могла разместить символы Юникода в BMP (Basic Multilingual Plan). Таким образом, в основном, даже с UTF-8, у вас не будет всего набора символов всего юникода. На практике это всего лишь проблема для редких китайских персонажей, если это действительно важно для вас.

Ответ 6

Мы использовали приложение, использующее латиницу, потому что оно было по умолчанию. Но позже нам пришлось изменить все на UTF из-за испанских символов, а не невероятно сложно, но не нужно было менять вещи излишне.

Итак, короткий ответ - это просто с UTF-8 с самого начала, это сэкономит вам больше времени.

Ответ 7

Я не эксперт, но я всегда понимал, что UTF-8 на самом деле представляет собой набор кодировки шириной 4 байта, а не 3. И, как я понимаю, реализация MySQL utf8_unicode_ci обрабатывает только 3-байтовый набор кодировок...

Если вам нужна 4-байтовая кодировка полного UTF-8, вам необходимо использовать кодировку utf8mb4_unicode_ci для вашей базы данных/таблиц MySQL.