Невозможно создать столбец в базе данных MySQL с типом данных TEXT - PullRequest
0 голосов
/ 03 октября 2009

Я создаю таблицу для хранения элементов из RSS-каналов, и мне нужно создать столбец «описание». Я выбрал тип данных TEXT без ограничений, без индекса для этого столбца. Это ошибка, которую я получаю:

#1071 - Specified key was too long; max key length is 1000 bytes

Если я выберу индексировать этот столбец, я получу сообщение об ошибке:

#1170 - BLOB/TEXT column 'description' used in key specification without a key length

Любая длина, указанная для этого столбца, возвращает первую ошибку, которую я получил. Может кто-нибудь сказать мне, что я делаю не так? Спасибо!

UPDATE:

Я использую MySQL 5.0.4

Вот запрос, который я использую для создания таблицы:

CREATE TABLE  `feed_items` (

`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`feed_id` INT NOT NULL COMMENT  '`feeds`.`id`',
`guid` VARCHAR( 255 ) NOT NULL ,
`publish_date` DATETIME NOT NULL ,
`update_of` INT NULL COMMENT  '`feed_items`.`id`',
`link` VARCHAR( 255 ) NOT NULL ,
`title` VARCHAR( 255 ) NOT NULL ,
`description` TEXT NOT NULL ,
`comments_link` VARCHAR( 255 ) NULL ,
INDEX (  `feed_id` ,  `guid` ,  `publish_date` ,  `update_of` ,  `title` )
) ENGINE = MYISAM

1 Ответ

1 голос
/ 03 октября 2009

Даже при том, что это было с некоторого времени, кажется, что это сообщение об ошибке, с которым у вас есть проблема: http://bugs.mysql.com/bug.php?id=4541

Возможно, вы захотите прочитать комментарии к этой ошибке и посмотреть, имеют ли они отношение к вашей ситуации, поскольку трудно помочь, не видя, какую команду вы использовали для получения этой ошибки, и не зная, какая версия mysql. 1004 *

ОБНОВЛЕНИЕ: в зависимости от вашего запроса вы можете сначала удалить это:

INDEX (  `feed_id` ,  `guid` ,  `publish_date` ,  `update_of` ,  `title` )

Затем попробуйте сделать:

INDEX (  `feed_id`)

Когда я вижу такой длинный указатель, я становлюсь подозрительным.

В идеале вы должны индексировать то, что вы будете делать, выбирает, поэтому, если у вас нет

SELECT * FROM table WHERE feed_id=? AND guid=? AND publish_date=? AND update_of=? and title=?

тогда этот индекс бесполезен. Поскольку feed_id является первичным ключом, вы должны просто сделать

SELECT * FROM table where feed_id=?

, поскольку он однозначно вернет одну строку.

Так что индекс, который я имею выше, будет тем, что нужно. Вам также может понадобиться отдельный индекс для заголовка и, возможно, publish_date.

Посмотрите, какие запросы вы пишете, и тогда вы сможете определить, где должны быть индексы. Индексы будут дороже, если вы добавите больше строк, поэтому не нужно слишком много индексировать, но слишком мало индексировать бесполезно, поэтому я предлагаю вам посмотреть на запросы и решить, где иметь индексы.

...