Проблема: MySQL на хостинге сортирует строки только по первым 10 символам.

Тема в разделе "Администрирование серверов", создана пользователем cinemaxx, 7 дек 2010.

Статус темы:
Закрыта.
Модераторы: mefish, stooper
  1. cinemaxx

    cinemaxx Постоялец

    Регистр.:
    21 апр 2010
    Сообщения:
    59
    Симпатии:
    6
    Проблема: MySQL на хостинге сортирует строки только по первым 10 символам.
    Возможно как-то связано с настройкой параметра "filesort" в MySQL

    Для демонстрации проблемы создал в базе таблицу bak_vm_product с четырьмя тестовыми строками.

    Делаю выборку с сортировкой:
    SELECT *
    FROM `bak_vm_product`
    ORDER BY `bak_vm_product`.`product_name` ASC

    Получаю:
    1234567891
    1234567892
    12345678992
    12345678991

    Т.е. поле product_name сортируется неверно - только по первым 10 символам.
    Анализ запроса показывает параметр: Using filesort - возможно дело в его настройках?

    Локально делаю ту же операцию на денвере, всё сортируется нормально:
    1234567891
    1234567892
    12345678991
    12345678992

    Кто-нибудь может помочь?
    Хостинг: hoster.by
    Платформа: Linux vh36.hoster.by 2.6.18-294.17.1.el5.lve0.7.40 #1 SMP Sat Oct 9 17:58:50 EEST 2010 x86_64
    Версия MySQL: 5.1.49-rel11.3
    Сравнение БД: utf8_general_ci
     
  2. BFox

    BFox

    Регистр.:
    11 янв 2008
    Сообщения:
    368
    Симпатии:
    65
    таблица в какой кодировке? посмотрите что бы тоже была в utf8_general_ci
     
  3. cinemaxx

    cinemaxx Постоялец

    Регистр.:
    21 апр 2010
    Сообщения:
    59
    Симпатии:
    6
    С кодировкой всё в порядке.
    bak_vm_product MyISAM utf8_general_ci

    Он ведь сортирует строки, если встречаются различия в первых десяти символах. Эти позиции сортирует нормально и по убыванию и по возрастанию:
    1234567891
    1234567892

    А эти никак не сортирует:
    12345678991
    12345678992
     
  4. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    есть такое понятие как индекс поля.
    для строк индексация ведется по префиксу строки, причем длина префикса задается при создании индекса.
    для данного поля анврено стоит индекс длиной 10 символов
     
  5. cinemaxx

    cinemaxx Постоялец

    Регистр.:
    21 апр 2010
    Сообщения:
    59
    Симпатии:
    6
    Не влияет в данной ситуации. Пробовал менять, увеличивал - бестолку.

    -- Structure`bak_vm_product`
    CREATE TABLE IF NOT EXISTS `bak_vm_product` (
    `product_id` int(11) NOT NULL AUTO_INCREMENT,
    `product_name` varchar(64) DEFAULT NULL,
    PRIMARY KEY (`product_id`),
    KEY `idx_product_name` (`product_name`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='All products are stored here.' AUTO_INCREMENT=12 ;

    -- Dump table `bak_vm_product`
    INSERT INTO `bak_vm_product` (`product_id`, `product_name`) VALUES
    (7, '12345678992'),
    (3, '1234567891'),
    (6, '12345678991'),
    (5, '1234567892'),
    (8, '12345678997'),
    (9, '12345678994'),
    (10, '1234567897'),
    (11, '1234567894');


    Запрос:
    SELECT *
    FROM `bak_vm_product`
    ORDER BY `bak_vm_product`.`product_name` ASC

    Выдаёт:
    1234567891
    1234567892
    1234567894
    1234567897
    12345678992
    12345678991
    12345678997
    12345678994



    Запрос:
    SELECT *
    FROM `bak_vm_product`
    ORDER BY `bak_vm_product`.`product_name` DESC

    Выдает:
    12345678992
    12345678991
    12345678997
    12345678994
    1234567897
    1234567894
    1234567892
    1234567891
     
  6. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    вы не увеличивали длину индекса.
    вы увелилчи только размер поля, а длина индекса осталась равной нулю
    вот пример с длиной индекса равной 64
    Код:
    -- Structure`bak_vm_product`
    CREATE TABLE IF NOT EXISTS `bak_vm_product` (
    `product_id` int(11) NOT NULL AUTO_INCREMENT,
    `product_name` varchar(64) DEFAULT NULL,
    PRIMARY KEY (`product_id`),
    KEY `idx_product_name` (`product_name`(64))
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='All products are stored here.' AUTO_INCREMENT=12 
    
    затем ваш INSERT
    и результат вашего SELECT-a
    Код:
     
     	 	 	3	1234567891
     	 	 	5	1234567892
     	 	 	11	1234567894
     	 	 	10	1234567897
     	 	 	6	12345678991
     	 	 	7	12345678992
     	 	 	9	12345678994
     	 	 	8	12345678997
    
    и в обратном порядке
    Код:
     
     	 	 	8	12345678997
     	 	 	9	12345678994
     	 	 	7	12345678992
     	 	 	6	12345678991
     	 	 	10	1234567897
     	 	 	11	1234567894
     	 	 	5	1234567892
     	 	 	3	1234567891
    
     
  7. Juri

    Juri

    Заблокирован
    Регистр.:
    5 окт 2007
    Сообщения:
    1.068
    Симпатии:
    197
    Я не знаю, может я не понял, но вы же сортируете по имени, а оно у вас равно null везде. Даже если и не равно нулл причем сортировка по названию к ид этой записи?
     
  8. cinemaxx

    cinemaxx Постоялец

    Регистр.:
    21 апр 2010
    Сообщения:
    59
    Симпатии:
    6
    Только что проверил на хостинге:
    Код:
    -- Structure`bak_vm_product`
    CREATE TABLE IF NOT EXISTS `bak_vm_product` (
    `product_id` int(11) NOT NULL AUTO_INCREMENT,
    `product_name` varchar(64) DEFAULT NULL,
    PRIMARY KEY (`product_id`),
    KEY `idx_product_name` (`product_name`(64))
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='All products are stored here.' AUTO_INCREMENT=12;
    Не сортирует на хосте:
    Платформа: Linux vh36.hoster.by 2.6.18-294.17.1.el5.lve0.7.40 #1 SMP Sat Oct 9 17:58:50 EEST 2010 x86_64
    Версия MySQL: 5.1.49-rel11.3
    Сравнение БД: utf8_general_ci
    Версия PHP: 5.2.14

    Локально сортируется без проблем.

    Добавлено через 1 минуту
    Я же заполнил таблицу:
    product_id, product_name
    (7, '12345678992'),
    (3, '1234567891'),
    (6, '12345678991'),
    (5, '1234567892'),
    (8, '12345678997'),
    (9, '12345678994'),
    (10, '1234567897'),
    (11, '1234567894');
     
  9. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    Даже не знаю
    проверьте через phpMyAdmin точно ли создался индекс ненулевой длины
    вкладка Structure - нижний блок Details - табличка Indexes:
    возможно вы выполнили данный запрос не удалив старую таблицу(он не удаляет самостоятельно)
     
Статус темы:
Закрыта.