Эффективный способ индексировать столбец таблицы MySQL с помощью кодировки utf8

CREATE TABLE profile_category (
  id mediumint UNSIGNED NOT NULL AUTO_INCREMENT,
  pc_name char(255) NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY idx_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Это одна из таблиц в базе данных, которая полностью находится в кодировке utf8. Проблема здесь (и я не знал об этом до сих пор), этот индекс для pc_name столбец будет в три раза больше, потому что MySQL резервирует 3 укуса для каждого символа. В этом случае индексы займут гораздо больше места.

Я не могу сделать более короткий индекс, потому что мне нужно, чтобы это значение было уникальным. Одно из решений может быть установлено pc_name char(255) CHARSET latin1 NOT NULL, но я не знаю, если это проблема или нет. Это хорошая идея, или есть какие-то решения, которые я не знаю?

Обновление: pc_name столбец проверяется в приложении, чтобы быть действительным utf8. И это позволяет не западные символы. Но в этом случае я могу просто совершить сделку и разрешить только /[_A-Za-z]/ если дело того стоит.

Обновление 2: я пытался установить pc_name в latin1 charset, но теперь я получаю исключения, такие как: Zend_Db_Statement_Exception: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

1 ответ

Решение

Если pc_name будет содержать не-западный текст, то latin1 здесь не будет опцией - в противном случае, сделайте это.

Не будучи хардкорным MySQL'er, я не знаю, чревато ли смешивание таблиц InnoDB и MySQL проблемами - если нет, возможно, вы могли бы сделать эту таблицу стандартной таблицей MySQL и оставить ее как utf8?

Другие вопросы по тегам