51 ап, при апдейте ошибка MySQL

Post Reply
magicum
Posts: 351
Joined: Mon Nov 18, 2013 11:27 am

51 ап, при апдейте ошибка MySQL

Post by magicum »

При каждой попытке апдейта 51 в консоль выводится одна и таже ошибка MySQL.

Вот текст ошибки:

Code: Select all

Mysql error:: 1071 (Specified key was too long; max key length is 1000 bytes) (db_link) in query ALTER TABLE `links` CHANGE `link` `link` VARCHAR( 255 ) NOT NULL .
После этого скрипт апдейта сообщает, что завершил апдейт успешно.

В данном случае не очень понятно, почему успешно при наличии ошибки.

Вот содержимое таблицы "links" из этой базы данных:

Code: Select all

mysql> select * from links;
+------------+----------------------------------------------------+-----+--------+
| trader     | link                                               | num | hour   |
+------------+----------------------------------------------------+-----+--------+
| overclicks | overclick_from_noref                               |   1 | 385279 |
| overclicks | overclick_from_noref                               |   1 | 385280 |
| noref      | lp_in_/photo/nesty-on-21naturals-com-melody/index. |   2 | 385280 |
| noref      | lp_in_/?skip_cache=1                               |   2 | 385284 |
| overclicks | overclick_from_noref                               |   7 | 385284 |
| noref      | lp_in_/photo/nesty-on-21naturals-com-melody/       |   1 | 385284 |
| overclicks | overclick_from_noref                               |  13 | 385285 |
| noref      | lp_in_/teens/ctr/1/?skip_cache=1                   |   1 | 385285 |
| noref      | lp_in_/photo/dido-angel-on-21naturals-com/         |   2 | 385285 |
| noref      | lp_in_/photo/dido-angel-on-21naturals-com/?skip_ca |   1 | 385285 |
| overclicks | overclick_from_noref                               |  65 | 385286 |
| noref      | lp_in_/photo/dido-angel-on-21naturals-com/?skip_ca |  11 | 385286 |
| overclicks | overclick_from_noref                               |  27 | 385287 |
| overclicks | overclick_from_noref                               |  18 | 385288 |
| overclicks | overclick_from_noref                               |  14 | 385289 |
+------------+----------------------------------------------------+-----+--------+
15 rows in set (0.00 sec)
Что нужно сделать, чтобы избавиться от ошибки?
magicum
Posts: 351
Joined: Mon Nov 18, 2013 11:27 am

Re: 51 ап, при апдейте ошибка MySQL

Post by magicum »

Нашел в scj.sql такие строки для создания таблицы "links".

Code: Select all

DROP TABLE IF EXISTS `links`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `links` (
  `trader` char(100) NOT NULL,
  `link` char(50) NOT NULL,
  `num` int(11) NOT NULL DEFAULT '0',
  `hour` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`trader`,`link`,`hour`)
) ENGINE=MyISAM ;
/*!40101 SET character_set_client = @saved_cs_client */;
Видно, что используется кодировка utf8, которая требует 3 байта, по моему, для каждого символа.
Далее мои догадки, я не силен в MySQL.

Для таблиц MyISAM максиальная длина KEY составляет 1000 байт.
Изначально создается KEY для полей trader, link, hour. Поля trader и link - символьные, поле hour - целочисленное. Длина кея составит 100*3+50*3+4=461 байт.

Далее, при апдейте скрипт пытается выполнить вот эту команду:

Code: Select all

ALTER TABLE `links` CHANGE `link` `link` VARCHAR( 255 ) NOT NULL;
То есть он меняет тип поля 'link' на VARCHAR, и изменяет его длину до 255 байт.

Считаем размер кея для новых условий: 255*3+50*3+4=919. По идее, должно хватать. Но почему-то не хватает. Или я неверно считаю.

Попробую конвертнуть таблицу в другой character set.
Last edited by magicum on Sun Dec 15, 2013 8:25 am, edited 1 time in total.
magicum
Posts: 351
Joined: Mon Nov 18, 2013 11:27 am

Re: 51 ап, при апдейте ошибка MySQL

Post by magicum »

Конвертнуть charset побоялся.
Попробовал тип VARCHAR(200) для поля "link" - сработало без ошибок.

Что делать дальше, как-то не знаю. Скрипт апдейта все равно будет пытаться сделать VARCHAR(255).

Жду официального ответа.
admin
Site Admin
Posts: 38004
Joined: Wed Sep 10, 2008 11:43 am

Re: 51 ап, при апдейте ошибка MySQL

Post by admin »

Да, почти так.

Таблица создается с дефолтными значениями, я не знаю что за scj.sql у вас на руках, но /scj/scj_pro.sql можно видеть что чарсет не указан для таблиц.

UTF8 это variable кодировка, в ней символ занимает от 1 до 3 байт, и конкретно в вашем примере - это все 1 байт. Но как оказалось при создании индекса mysql берет максимальную возможную длину - 3 байта плюс

Индекс изменен в апдейте.
Don't forget to run script update
magicum
Posts: 351
Joined: Mon Nov 18, 2013 11:27 am

Re: 51 ап, при апдейте ошибка MySQL

Post by magicum »

Спасибо
admin
Site Admin
Posts: 38004
Joined: Wed Sep 10, 2008 11:43 am

Re: 51 ап, при апдейте ошибка MySQL

Post by admin »

NP
Don't forget to run script update
Post Reply