Кодировка базы данных MYSQL, сочетание символов latin1 и utf-8 - PullRequest
0 голосов
/ 02 июня 2018

У меня есть более старая база данных MYSQL 5.6.34, созданная несколько лет назад (не мной).Я взял одну из баз данных и начал создавать в ней таблицы для использования в своих приложениях, когда заметил, что некоторые другие таблицы имеют кодировку latin1.Затем я заметил, что все базы данных, за исключением information_schema, все используют latin1.

SCHEMA_NAME         DEFAULT_CHARACTER_SET_NAME  DEFAULT_COLLATION_NAME
information_schema  utf8                        utf8_general_ci
443347_pxa          latin1                      latin1_swedish_ci
443348_srp          latin1                      latin1_swedish_ci
warehouseinventory  latin1                      latin1_swedish_ci

Я не уверен, почему первоначальный разработчик использовал latin1 для кодирования и сопоставления.На самом деле нет никаких причин.

Я не хочу менять кодировку в существующих базах данных, я просто хочу создавать новые таблицы с помощью utf8mb4.Но чем больше я думаю об этом, чтобы оставаться последовательным, я, возможно, захочу изменить их.Последняя база данных, которую я создал, была warehouseinventory, но я не заметил кодировку, и я предполагаю, что по умолчанию она равна latin1 на основе кодировки ранее созданных баз данных.

Есть ли причина, по которой я 'оставил бы их в latin1, и было бы больно менять их?В одной из баз данных хранится испанский язык, но я всегда думал, что это просто UTF.

1 Ответ

0 голосов
/ 03 июня 2018

Если у вас есть какие-либо индексы для столбцов, которые объявлены VARCHAR(255), вы можете получить ошибку об «индексе, превышающем 767 байт» при преобразовании в utf8mb4.Существует 5 обходных путей .

Если у вас нет индексированных символов от 191 до 255 символов, тогда

ALTER TABLE tbl CONVERT TO utf8mb4;

преобразует *1011* все столбцы в таблице tbl в utf8mb4.

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

Набор символов или сопоставление "по умолчанию" - это просто значение по умолчанию.То есть, когда создается новый столбец или таблица, он принимает по умолчанию .Если вы явно указываете набор символов и / или параметры сортировки для столбца, это переопределяет значение по умолчанию для таблицы.

Существует старое высказывание: «Если оно не сломано, не исправляйте его».Я склоняюсь к созданию новых баз данных / таблиц / столбцов utf8mb4, но оставляю старые в покое.Примечание: со смесью все в порядке. соединение указывает, какую кодировку использует клиент .MySQL в течение INSERT или SELECT будет конвертировать из / в настройки клиента в / из настроек столбца.

Испанский язык имеет ограниченный набор символов.Этот набор является подмножеством latin1, utf8 и utf8mb4, поэтому любая из этих кодировок работает с испанским языком.Однако кодировка отличается.Например, ñ - это

Hex F1   in latin1
Hex C3B1 in utf8 and utf8mb4

Аналогично для остальной части Западной Европы.Азии нужно как минимум utf8.Для эмодзи и некоторых китайских иероглифов требуется utf8mb4.

Если у вас появятся вопросительные знаки, моджибаке и т. Д., Отладьте его здесь .

Терминология:Вне MySQL: UTF-8;Внутри MySQL: utf8mb4.Это по сути то же самое.MySQL utf8 является их подмножеством.

Tést¥, в шестнадцатеричном виде:

54 E9 73 74 A5 -- cp1256, dec8, latin1, latin5  encoding
54 C3A9 73 74 C2A5 -- utf8, utf8mb4  encoding
54 C383 C2A9 73 74 C382 C2A5 -- "double encoded"; may show as Tést¥
...