Сортировка кириллических строк - MySQL

Узнай цену своей работы

Формулировка задачи:

Добрый день. Есть такая таблица:
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');
При сортировке по полю `description`
SELECT `description` FROM test_table ORDER BY `description` ASC;
SELECT `description` FROM test_table ORDER BY `description` DESC;
получаю результаты, представленные во вложениях. Наборы символов для поля `description` выставлял разные. Ни с одним из них не было правильной сортировки. Подскажите, пожалуйста, что я делаю не так?

Решение задачи: «Сортировка кириллических строк»

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

Объяснение кода листинга программы

  1. Убедитесь, что вы работаете в MySQL и выполните команду USE your_database (если необходим выбор базы данных).
  2. Создайте новую таблицу с помощью команды CREATE TABLE tsttable (id INT AUTO_INCREMENT PRIMARY KEY, dsc VARCHAR(250) CHARACTER SET CP1251) ENGINE=INNODB DEFAULT CHARACTER SET=UTF8;
  3. Вставьте данные в таблицу с помощью команды INSERT INTO tsttable (id, dsc) VALUES (3486, 'Аккумулятор секционный СА4М-18/1'), (3487, 'Аккумулятор секционный СА4М-18/10'), ... (3519, 'Аккумулятор мобильный широкий А4Ц-40/2');
  4. Отсортируйте данные в таблице по столбцу dsc с помощью команды SELECT * FROM tsttable ORDER BY dsc;
  5. Выполните команду DROP TABLE tsttable; для удаления таблицы (если необходимо).
  6. Завершите SQL-сессию с помощью команды \q.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.533 из 5
Похожие ответы