Эффективный способ индексировать столбец таблицы 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?