Сортировка кириллических строк - MySQL
Формулировка задачи:
Добрый день.
Есть такая таблица:
При сортировке по полю `description`
получаю результаты, представленные во вложениях.
Наборы символов для поля `description` выставлял разные. Ни с одним из них не было правильной сортировки.
Подскажите, пожалуйста, что я делаю не так?
CREATE TABLE IF NOT EXISTS `test_table` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `description` VARCHAR(250) CHARACTER SET cp1251 DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3520 DEFAULT CHARSET=utf8 COMMENT='Test'; INSERT INTO `test_table` (`id`, `description`) VALUES (3486, 'Аккумулятор секционный СА4М-18/1'), (3487, 'Аккумулятор секционный СА4М-18/10'), (3488, 'Аккумулятор секционный СА4М-18/12'), (3489, 'Аккумулятор секционный СА4М-18/2'), (3490, 'Аккумулятор секционный СА4М-18/3'), (3491, 'Аккумулятор секционный СА4М-18/4'), (3499, 'Аккумулятор мобильный узкий А4Ц-18/3'), (3500, 'Аккумулятор мобильный узкий А4Ц-18/3-И'), (3492, 'Аккумулятор секционный СА4М-18/5'), (3493, 'Аккумулятор секционный СА4М-18/6'), (3494, 'Аккумулятор секционный СА4М-18/9'), (3495, 'Аккумулятор секционный СА4М-50/1'), (3496, 'Аккумулятор секционный СА4М-50/2'), (3497, 'Аккумулятор мобильный узкий А4Ц-18/1'), (3498, 'Аккумулятор мобильный узкий А4Ц-18/2'), (3501, 'Аккумулятор мобильный узкий А4Ц-18/3-И-С'), (3502, 'Аккумулятор мобильный узкий А4Ц-18/4'), (3503, 'Аккумулятор мобильный широкий А4Ц-04А/1'), (3504, 'Аккумулятор мобильный широкий А4Ц-04А/2'), (3505, 'Аккумулятор мобильный широкий А4Ц-04А/3'), (3506, 'Аккумулятор мобильный широкий А4Ц-04А/4'), (3507, 'Аккумулятор мобильный широкий А4Ц-18А/1'), (3508, 'Аккумулятор мобильный широкий А4Ц-18А/1_КП'), (3509, 'Аккумулятор мобильный широкий А4Ц-18А/2'), (3510, 'Аккумулятор мобильный широкий А4Ц-18А/3'), (3511, 'Аккумулятор мобильный широкий А4Ц-18А/3_КП'), (3512, 'Аккумулятор мобильный широкий А4Ц-18А/4'), (3513, 'Аккумулятор мобильный широкий А4Ц-18А/4_КП'), (3514, 'Аккумулятор мобильный широкий А4Ц-18А/5'), (3515, 'Аккумулятор мобильный широкий А4Ц-18А/6'), (3516, 'Аккумулятор мобильный широкий А4Ц-18А/7'), (3517, 'Аккумулятор мобильный широкий А4Ц-18А/8'), (3518, 'Аккумулятор мобильный широкий А4Ц-40/1'), (3519, 'Аккумулятор мобильный широкий А4Ц-40/2');
SELECT `description` FROM test_table ORDER BY `description` ASC; SELECT `description` FROM test_table ORDER BY `description` DESC;
Решение задачи: «Сортировка кириллических строк»
textual
Листинг программы
mysql> drop table if exists tsttable; Query OK, 0 rows affected (0.00 sec) mysql> create table tsttable ( -> id int not null auto_increment, -> dsc varchar(250) character set cp1251 default null, -> primary key (id) -> ) engine=innodb default character set = utf8; Query OK, 0 rows affected (0.00 sec) mysql> mysql> INSERT INTO tsttable (id, dsc) VALUES -> (3486, 'Аккумулятор секционный СА4М-18/1'), -> (3487, 'Аккумулятор секционный СА4М-18/10'), -> (3488, 'Аккумулятор секционный СА4М-18/12'), -> (3489, 'Аккумулятор секционный СА4М-18/2'), -> (3490, 'Аккумулятор секционный СА4М-18/3'), -> (3491, 'Аккумулятор секционный СА4М-18/4'), -> (3499, 'Аккумулятор мобильный узкий А4Ц-18/3'), -> (3500, 'Аккумулятор мобильный узкий А4Ц-18/3-И'), -> (3492, 'Аккумулятор секционный СА4М-18/5'), -> (3493, 'Аккумулятор секционный СА4М-18/6'), -> (3494, 'Аккумулятор секционный СА4М-18/9'), -> (3495, 'Аккумулятор секционный СА4М-50/1'), -> (3496, 'Аккумулятор секционный СА4М-50/2'), -> (3497, 'Аккумулятор мобильный узкий А4Ц-18/1'), -> (3498, 'Аккумулятор мобильный узкий А4Ц-18/2'), -> (3501, 'Аккумулятор мобильный узкий А4Ц-18/3-И-С'), -> (3502, 'Аккумулятор мобильный узкий А4Ц-18/4'), -> (3503, 'Аккумулятор мобильный широкий А4Ц-04А/1'), -> (3504, 'Аккумулятор мобильный широкий А4Ц-04А/2'), -> (3505, 'Аккумулятор мобильный широкий А4Ц-04А/3'), -> (3506, 'Аккумулятор мобильный широкий А4Ц-04А/4'), -> (3507, 'Аккумулятор мобильный широкий А4Ц-18А/1'), -> (3508, 'Аккумулятор мобильный широкий А4Ц-18А/1_КП'), -> (3509, 'Аккумулятор мобильный широкий А4Ц-18А/2'), -> (3510, 'Аккумулятор мобильный широкий А4Ц-18А/3'), -> (3511, 'Аккумулятор мобильный широкий А4Ц-18А/3_КП'), -> (3512, 'Аккумулятор мобильный широкий А4Ц-18А/4'), -> (3513, 'Аккумулятор мобильный широкий А4Ц-18А/4_КП'), -> (3514, 'Аккумулятор мобильный широкий А4Ц-18А/5'), -> (3515, 'Аккумулятор мобильный широкий А4Ц-18А/6'), -> (3516, 'Аккумулятор мобильный широкий А4Ц-18А/7'), -> (3517, 'Аккумулятор мобильный широкий А4Ц-18А/8'), -> (3518, 'Аккумулятор мобильный широкий А4Ц-40/1'), -> (3519, 'Аккумулятор мобильный широкий А4Ц-40/2'); Query OK, 34 rows affected (0.00 sec) Records: 34 Duplicates: 0 Warnings: 0 mysql> mysql> select * from tsttable order by dsc; +------+--------------------------------------------+ | id | dsc | +------+--------------------------------------------+ | 3497 | Аккумулятор мобильный узкий А4Ц-18/1 | | 3498 | Аккумулятор мобильный узкий А4Ц-18/2 | | 3499 | Аккумулятор мобильный узкий А4Ц-18/3 | | 3500 | Аккумулятор мобильный узкий А4Ц-18/3-И | | 3501 | Аккумулятор мобильный узкий А4Ц-18/3-И-С | | 3502 | Аккумулятор мобильный узкий А4Ц-18/4 | | 3503 | Аккумулятор мобильный широкий А4Ц-04А/1 | | 3504 | Аккумулятор мобильный широкий А4Ц-04А/2 | | 3505 | Аккумулятор мобильный широкий А4Ц-04А/3 | | 3506 | Аккумулятор мобильный широкий А4Ц-04А/4 | | 3507 | Аккумулятор мобильный широкий А4Ц-18А/1 | | 3508 | Аккумулятор мобильный широкий А4Ц-18А/1_КП | | 3509 | Аккумулятор мобильный широкий А4Ц-18А/2 | | 3510 | Аккумулятор мобильный широкий А4Ц-18А/3 | | 3511 | Аккумулятор мобильный широкий А4Ц-18А/3_КП | | 3512 | Аккумулятор мобильный широкий А4Ц-18А/4 | | 3513 | Аккумулятор мобильный широкий А4Ц-18А/4_КП | | 3514 | Аккумулятор мобильный широкий А4Ц-18А/5 | | 3515 | Аккумулятор мобильный широкий А4Ц-18А/6 | | 3516 | Аккумулятор мобильный широкий А4Ц-18А/7 | | 3517 | Аккумулятор мобильный широкий А4Ц-18А/8 | | 3518 | Аккумулятор мобильный широкий А4Ц-40/1 | | 3519 | Аккумулятор мобильный широкий А4Ц-40/2 | | 3486 | Аккумулятор секционный СА4М-18/1 | | 3487 | Аккумулятор секционный СА4М-18/10 | | 3488 | Аккумулятор секционный СА4М-18/12 | | 3489 | Аккумулятор секционный СА4М-18/2 | | 3490 | Аккумулятор секционный СА4М-18/3 | | 3491 | Аккумулятор секционный СА4М-18/4 | | 3492 | Аккумулятор секционный СА4М-18/5 | | 3493 | Аккумулятор секционный СА4М-18/6 | | 3494 | Аккумулятор секционный СА4М-18/9 | | 3495 | Аккумулятор секционный СА4М-50/1 | | 3496 | Аккумулятор секционный СА4М-50/2 | +------+--------------------------------------------+ 34 rows in set (0.00 sec) mysql> \q
Объяснение кода листинга программы
- Убедитесь, что вы работаете в MySQL и выполните команду
USE your_database
(если необходим выбор базы данных). - Создайте новую таблицу с помощью команды
CREATE TABLE tsttable (id INT AUTO_INCREMENT PRIMARY KEY, dsc VARCHAR(250) CHARACTER SET CP1251) ENGINE=INNODB DEFAULT CHARACTER SET=UTF8;
- Вставьте данные в таблицу с помощью команды
INSERT INTO tsttable (id, dsc) VALUES (3486, 'Аккумулятор секционный СА4М-18/1'), (3487, 'Аккумулятор секционный СА4М-18/10'), ... (3519, 'Аккумулятор мобильный широкий А4Ц-40/2');
- Отсортируйте данные в таблице по столбцу
dsc
с помощью командыSELECT * FROM tsttable ORDER BY dsc;
- Выполните команду
DROP TABLE tsttable;
для удаления таблицы (если необходимо). - Завершите SQL-сессию с помощью команды
\q
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д