Что не так с этим утверждением?

mysql> create table newsgroup(
    ->  id integer unsigned NOT NULL AUTO_INCREMENT,
    ->  creater integer unsigned NOT NULL,
    ->  coremember integer unsigned DEFAULT NULL,
    ->  name varchar(300) not null unique,
    ->  description text,
    ->  created datetime not null,
    ->  PRIMARY KEY (id)
    -> );
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
mysql>

Я изменился 300 в 250и это нормально. Но я не очень понимаю.

4 ответа

Решение

Ваша кодировка базы данных установлена ​​на UTF8

UTF8 персонаж может занять до 3 байты в MySQL, так 767 байты 255 персонажи.

Создание UNIQUE Индекс для таких длинных текстовых полей не рекомендуется.

Вместо этого создайте простой индекс с префиксом

CREATE INDEX ix_newsgroup_name ON newsgroup (name (30))

, что достаточно для поиска с префиксом, и добавьте еще один столбец для хранения MD5 хеш, который обеспечит уникальность.

767 байт - это заявленное ограничение префикса для таблиц InnoDB.:)

Смотрите здесь: http://dev.mysql.com/doc/refman/5.1/en/create-index.html

Вы используете utf-8 или даже более тяжелую кодировку, и поэтому каждый символ представлен одним, двумя, тремя или четырьмя байтами. В MySQL utf8 обозначает максимальную 3-байтовую последовательность, и utf8mb4 для макс 4-байтовой последовательности.

Удалить УНИКАЛЬНЫЙ из varchar.

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