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

Статус
В этой теме нельзя размещать новые ответы.

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
 
таблица в какой кодировке? посмотрите что бы тоже была в utf8_general_ci
 
С кодировкой всё в порядке.
bak_vm_product MyISAM utf8_general_ci

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

А эти никак не сортирует:
12345678991
12345678992
 
есть такое понятие как индекс поля.
для строк индексация ведется по префиксу строки, причем длина префикса задается при создании индекса.
для данного поля анврено стоит индекс длиной 10 символов
 
Не влияет в данной ситуации. Пробовал менять, увеличивал - бестолку.

-- 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
 
вы не увеличивали длину индекса.
вы увелилчи только размер поля, а длина индекса осталась равной нулю
вот пример с длиной индекса равной 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
Не влияет в данной ситуации. Пробовал менять, увеличивал - бестолку.
-- 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

Я не знаю, может я не понял, но вы же сортируете по имени, а оно у вас равно null везде. Даже если и не равно нулл причем сортировка по названию к ид этой записи?
 
Только что проверил на хостинге:
Код:
-- 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 минуту
Я не знаю, может я не понял, но вы же сортируете по имени, а оно у вас равно null везде. Даже если и не равно нулл причем сортировка по названию к ид этой записи?

Я же заполнил таблицу:
product_id, product_name
(7, '12345678992'),
(3, '1234567891'),
(6, '12345678991'),
(5, '1234567892'),
(8, '12345678997'),
(9, '12345678994'),
(10, '1234567897'),
(11, '1234567894');
 
Даже не знаю
проверьте через phpMyAdmin точно ли создался индекс ненулевой длины
вкладка Structure - нижний блок Details - табличка Indexes:
возможно вы выполнили данный запрос не удалив старую таблицу(он не удаляет самостоятельно)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху