BLOB / TEXT столбец «значение», используемый в спецификации ключа без длины ключа - PullRequest
5 голосов
/ 03 сентября 2011

Я разработал расширение, которое отлично работает на Magento до 1.6 (я пробую Enterprise ed, и я предположил бы, что у Community та же проблема, так как у него тот же код).В моем скрипте установки я звоню $installer->createEntityTables($this->getTable('alphanum/info'));.Установка идет нормально, пока не доходит до таблицы сущностей _text.Там вылетает!Оказывается, когда я регистрирую sql и запускаю его через PHPmyadmin, это ошибка: BLOB/TEXT column 'value' used in key specification without a key length.Я посмотрел на код, и вот что пытается сгенерировать индекс для столбца значения:

->addIndex($this->getIdxName($eavTableName, array('attribute_id', 'value')),
     array('attribute_id', 'value'))
->addIndex($this->getIdxName($eavTableName, array('entity_type_id', 'value')),
     array('entity_type_id', 'value'))

У него нет операторов if, чтобы убедиться, что он не имеет типа text.Есть что-то, чего мне не хватает?Нужно ли менять конфигурацию моей БД?Может ли это быть ошибкой?

Я разбирался в том, чтобы поместить в него оператор if (вырвать его из родительской цепочки), чтобы получить расширение. Это должно хорошо сработать.Я посмотрел на предыдущую версию (1.5.something), и там не было этого индекса.Я просто не могу понять, почему это не вызвало много проблем, когда они добавили его.Заставляет меня задуматься, не в этом ли моя проблема?

Не знаю, поможет ли это включить SQL, созданный Magento:

CREATE TABLE `alphanum_info_text` (
  `value_id` int NOT NULL auto_increment COMMENT 'Value Id',
  `entity_type_id` smallint UNSIGNED NOT NULL default '0' COMMENT 'Entity Type Id',
  `attribute_id` smallint UNSIGNED NOT NULL default '0' COMMENT 'Attribute Id',
  `store_id` smallint UNSIGNED NOT NULL default '0' COMMENT 'Store Id',
  `entity_id` int UNSIGNED NOT NULL default '0' COMMENT 'Entity Id',
  `value` text NOT NULL COMMENT 'Attribute Value',
  PRIMARY KEY (`value_id`),
  INDEX `IDX_ALPHANUM_INFO_TEXT_ENTITY_TYPE_ID` (`entity_type_id`),
  INDEX `IDX_ALPHANUM_INFO_TEXT_ATTRIBUTE_ID` (`attribute_id`),
  INDEX `IDX_ALPHANUM_INFO_TEXT_STORE_ID` (`store_id`),
  INDEX `IDX_ALPHANUM_INFO_TEXT_ENTITY_ID` (`entity_id`),
  INDEX `IDX_ALPHANUM_INFO_TEXT_ATTRIBUTE_ID_VALUE` (`attribute_id`, `value`),
  INDEX `IDX_ALPHANUM_INFO_TEXT_ENTITY_TYPE_ID_VALUE` (`entity_type_id`, `value`),
  CONSTRAINT `FK_ALPHANUM_INFO_TEXT_ENTITY_ID_EAV_ENTITY_ENTITY_ID` FOREIGN KEY     (`entity_id`) REFERENCES `eav_entity` (`entity_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `FK_ALPHA_NUM_TEXT_ENTT_TYPE_ID_EAV_ENTT_TYPE_ENTT_TYPE_ID` FOREIGN KEY (`entity_type_id`) REFERENCES `eav_entity_type` (`entity_type_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `FK_ALPHANUM_INFO_TEXT_STORE_ID_CORE_STORE_STORE_ID` FOREIGN KEY (`store_id`) REFERENCES `core_store` (`store_id`) ON DELETE CASCADE ON UPDATE CASCADE
) COMMENT='Eav Entity Value Table' ENGINE=INNODB charset=utf8 COLLATE=utf8_general_ci

Ответы [ 3 ]

9 голосов
/ 04 ноября 2011

Похоже, что это проблема (имеющая ту же проблему прямо сейчас), эти две строки:

INDEX `IDX_ALPHANUM_INFO_TEXT_ATTRIBUTE_ID_VALUE` (`attribute_id`, `value`),
INDEX `IDX_ALPHANUM_INFO_TEXT_ENTITY_TYPE_ID_VALUE` (`entity_type_id`, `value`),

Нужно, чтобы числовые значения были перечислены в следующем виде:

INDEX `IDX_ALPHANUM_INFO_TEXT_ATTRIBUTE_ID_VALUE` (`attribute_id`, `value`(255)),
INDEX `IDX_ALPHANUM_INFO_TEXT_ENTITY_TYPE_ID_VALUE` (`entity_type_id`, `value`(255)),

Plugчто в, и это будет работать.Хитрость заключается в том, чтобы заставить его вставлять правильно.Ради краткости я не буду публиковать всю функцию, но в Mage_Eav_Model_Entity_Setup::createEntityTables примерно в строке 1341 вам нужно изменить эти строки:

            ->addIndex($this->getIdxName($eavTableName, array('attribute_id', 'value')),
                array('attribute_id', 'value'))
            ->addIndex($this->getIdxName($eavTableName, array('entity_type_id', 'value')),
                array('entity_type_id', 'value'))

следующим образом:

            ->addIndex($this->getIdxName($eavTableName, array('attribute_id', 'value')),
                array('attribute_id', $type == 'text' ? array('name' => 'value', 'size' => 255) : 'value'))
            ->addIndex($this->getIdxName($eavTableName, array('entity_type_id', 'value')),
                array('entity_type_id', $type == 'text' ? array('name' => 'value', 'size' => 255) : 'value'))

Я не совсем уверен, что вы должны установить значение размера, но я думаю, что установка его на полные 64 КБ потеряет цель индексирования в первую очередь.Надеюсь, кто-то, кто знает немного больше о SQL, чем я буду вмешиваться.

Надеюсь, что помогает.

0 голосов
/ 06 апреля 2016
alter table table_name add  index index_name (column_name(767));

ПРИМЕЧАНИЕ : 767 - количество символов, до которого MySQL будет индексировать столбцы при работе с BLOB / текстовыми индексами

Ссылка: http://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html

0 голосов
/ 03 сентября 2011

Это не ошибка magento, скорее mysql и ваша (потому что вы не знаете этого ограничения mysql). Смотрите эту тему: Ошибка MySQL: спецификация ключа без длины ключа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...