Будут ли затронуты существующие индексы при изменении набора символов и сопоставления MySQL дБ - PullRequest
1 голос
/ 09 января 2020
  1. У нас есть база данных, в которой набор символов по умолчанию для таблиц и столбцов установлен на utf8 кодировка
  2. Но с кодировкой набора символов utf8 , мы не можем сохранить смайлики
  3. Чтобы поддержать сохранение смайликов, а) Нам пришлось изменить набор символов таблицы и столбцов на utf8mb4 b) Нам пришлось изменить параметры сортировки таблицы и столбцы в utf8mb4_unicode_ci c) Обновите наш драйвер JDB C, чтобы он поддерживал кодировку Unicode

С учетом вышеуказанных изменений мы можем сохранить смайлики в наших столбцах.

Вопрос: 1) Нужно ли удалять существующие индексы (столбцы varchar) и воссоздавать индексы, как раньше: для utf8 каждый символ занимал 3 байта, а теперь с кодировкой utf8mb4 он будет занимать 4 байта?

1 Ответ

2 голосов
/ 10 января 2020

Индекс - это упорядоченный список указателей на строки таблицы. Порядок основан на значениях CHARACTER SET и COLLATION столбца (-ов) индекса. Если вы измените либо, индекс должен быть перестроен. «Указатель» (в данном контексте) является копией PRIMARY KEY.

. Вы должны сделать один или другой из

ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4 COLLATE ...,;

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

ALTER TABLE tbl MODIFY col_name ... CHARACTER SET utf8mb4 COLLATE ...;

, где первый '...' - это остаток определения столбца (VARCHAR, NOT NULL, что угодно).

Все индексы, которые включают изменяемые столбцы, будут перестроены. В частности, обратите внимание, что VARCHAR PRIMARY KEY фактически присутствует в каждом вторичном индексе.

Сортировка utf8mb4_unicode_ci довольно старая; вы можете предпочесть utf8mb4_unicode_520_ci, особенно потому, что он обрабатывает эмодзи как отдельные, а не смешанные вместе (IIR C).

Тот факт, что utf8 является подмножеством utf8mb4, не имеет значения; MySQL видит это как изменение и не предпринимает никаких коротких путей.

...