Когда использовать utf-8 и когда использовать latin1 в MySQL? - PullRequest
10 голосов
/ 01 февраля 2011

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

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

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

Спасибо, Alex

Ответы [ 7 ]

9 голосов
/ 01 февраля 2011

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

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

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

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

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

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

9 голосов
/ 01 февраля 2011

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

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

enter image description here

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

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

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

4 голосов
/ 01 февраля 2011

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

2 голосов
/ 01 февраля 2011

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

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

1 голос
/ 30 мая 2017

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

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

1 голос
/ 01 февраля 2011

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

Так что краткий ответ - просто начните с UTF-8 с самого начала, это избавит вас от проблем позже.

1 голос
/ 01 февраля 2011

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

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

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

...