Что не так с этим утверждением?
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-байтовой последовательности.