Сортировка кириллических строк - 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.