Акцент-нечувствительная сортировка в MySQL - PullRequest
11 голосов
/ 05 марта 2010

Я пытаюсь добиться сортировки без учета регистра и акцента в MySQL. Следуя инструкциям в руководстве, это должно работать с набором символов utf8 и сопоставлением utf8_general_ci.

Когда я следую примеру в руководстве (http://dev.mysql.com/doc/refman/5.1/en/charset-collation-implementations.html) в разделе «Параметры сортировки для многобайтовых наборов символов Юникода», я не получаю те же результаты:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 679877
Server version: 5.1.41-log MySQL Community Server (GPL) by Remi

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SET NAMES 'utf8' COLLATE 'utf8_general_ci';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT 'a' = 'A', 'a' = 'À', 'a' = 'á';
+-----------+-----------+-----------+
| 'a' = 'A' | 'a' = 'À' | 'a' = 'á' |
+-----------+-----------+-----------+
|         1 |         0 |         0 |
+-----------+-----------+-----------+
1 row in set (0.00 sec)

mysql> 

В примере в руководстве все они равны 1.

Также невозможно обрабатывать символы с акцентом одинаково, когда я пытаюсь установить параметры сортировки непосредственно в запросе. В этом примере таблица использует latin1, и я конвертирую в utf8.

mysql> select * from test;
+----------+
| k        |
+----------+
| Cárdenas |
| Cardozo  |
| Corbin   |
| Cabrero  |
+----------+

mysql> select k from test order by convert(k using utf8) collate utf8_general_ci
;
+----------+
| k        |
+----------+
| Cabrero  |
| Cardozo  |
| Corbin   |
| Cárdenas |
+----------+
4 rows in set (0.00 sec)

Следует игнорировать ударение над 'a' в последней записи и сортировать его по секунде. Есть идеи, что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 11 марта 2010

Работает на моей установке MySQL по умолчанию. Поскольку вы не предоставили SHOW FULL COLUMNS из теста (комментарий @fsb), все же возможно, что параметры сортировки в структуре вашей таблицы неправильные.

  • Установлено ли для сопоставления столбца 'k' значение, отличное от utf8_general_ci?

  • Проверьте, дает ли SELECT k из имен ORDER BY k ASC правильный ответ

  • Был ли изменен установочный файл MySQL Index.xml для изменения значения utf8_general_ci?

Соответствующая часть моей установки для сравнения:

<charset name="utf8">
  <family>Unicode</family> 
  <description>UTF-8 Unicode</description> 
  <alias>utf-8</alias> 
  <collation name="utf8_general_ci" id="33">
    <flag>primary</flag> 
    <flag>compiled</flag> 
  </collation>
  <collation name="utf8_bin" id="83">
    <flag>binary</flag> 
    <flag>compiled</flag> 
  </collation>
 </charset>
  • Был ли изменен скомпилированный код, чтобы изменить значение utf8_general_ci?

Возможно, кто-то еще подправил одну из этих вещей для какой-то гнусной цели ...

0 голосов
/ 11 марта 2010

Я мог бы что-то здесь упустить ... но вы не можете просто создать функцию (скажем, removeAccents), которая принимает строку и возвращает эквивалентную строку без ударения, а затем сортирует по removeAccents(field). Я считаю, что вы можете создать индекс для этого, что должно помочь с производительностью.

...