Порядок сортировки MySQL - сортировка? - PullRequest
2 голосов
/ 13 декабря 2011

Мне трудно сортировать поле char в MySQL.Проблема в том, что акцентированные символы смешиваются с неакцентированными.Например:

Abc
Ábd
Acc

Я думал, что это как-то связано с сопоставлением.Поэтому я изменил параметры сортировки моей таблицы на utf8-ut8_bin после прочтения этого поста .На самом деле, я несколько раз переделывал таблицу в различные сопоставления.Никакой сигары.

Я должен также добавить это, я не возражаю против порядка сортировки, пока сортировка не приводит к смешанному списку.Другими словами, это нормально:

Ábd
Abc
Acc

и так:

Abc
Acc
Ábd

С нетерпением ждем вашего ответа.

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Вам просто нужно использовать регистр с учетом регистра, например: utf8_general_cs.

UPD

Извините, похоже нет utf8_general_cs, хотя utf8_bin должно работать.

И вы должны изменить параметры сортировки определенного поля вместо таблицы (или убедитесь, что поле использует значения таблицы по умолчанию)).

mysql> SELECT * FROM (
    -> SELECT 'A' as l
    -> UNION ALL
    -> SELECT 'á' as l
    -> UNION ALL
    -> SELECT 'A' as l) ls
    -> ORDER BY l;
+----+
| l  |
+----+
| A  |
| á  |
| A  |
+----+
3 rows in set (0.00 sec)

mysql> SELECT * FROM (
    -> SELECT 'A' as l
    -> UNION ALL
    -> SELECT 'á' as l
    -> UNION ALL
    -> SELECT 'A' as l) ls
    -> ORDER BY l COLLATE utf8_bin;
+----+
| l  |
+----+
| A  |
| A  |
| á  |
+----+
3 rows in set (0.00 sec)
0 голосов
/ 06 июня 2017

@ newtower имел хорошую отправную точку, но ни он, ни «Сообщество» не поняли, что это не дало результатов. Поэтому я даю ответ, который должен «исправить» это:

unicode_ci (и практически все другие сопоставления):

SET NAMES utf8 COLLATE utf8_unicode_ci;

SELECT GROUP_CONCAT(l SEPARATOR '=') AS gc
  FROM (
    SELECT 'A' as l  UNION ALL
    SELECT 'á' as l  UNION ALL
    SELECT 'A' as l              ) ls
  GROUP BY l
  ORDER BY gc;

+--------+
| gc     |
+--------+
| A=á=A  |
+--------+

Бен:

SET NAMES utf8 COLLATE utf8_bin;

SELECT GROUP_CONCAT(l SEPARATOR '=') AS gc
  FROM (
    SELECT 'A' as l  UNION ALL
    SELECT 'á' as l  UNION ALL
    SELECT 'A' as l              ) ls
  GROUP BY l
  ORDER BY gc;

+------+
| gc   |
+------+
| A=A  |
| á    |
+------+

(Вы можете добавить DISTINCT в GROUP_CONCAT, чтобы избежать дублирования A.)

А вот полный список сопоставлений utf8 (с использованием этой техники): http://mysql.rjweb.org/utf8_collations.html

Предлагаем вам нажать «Влияет на меня» на https://bugs.mysql.com/bug.php?id=58797

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...