Акцент-чувствительная сортировка в MySQL
Я пытаюсь выполнить акцент и сортировку без учета регистра в MySQL. Следуя инструкциям в руководстве, это должно работать с набором символов utf8 и настройкой utf8_general_ci.
Когда я следую примеру в руководстве (http://dev.mysql.com/doc/refman/5.1/en/charset-collation-implementations.html) в разделе "Коллажи для многобайтовых наборов символов Unicode", я не получаю те же результаты:
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" в последней записи и сортировать его второй. Любые идеи, что я делаю неправильно?
Ответы
Ответ 1
Он работает на моей установке MySQL по умолчанию. Поскольку вы не предоставили SHOW FULL COLUMNS из теста (комментарий @fsb), все же возможно, что сортировка в структуре таблицы неверна.
-
Является ли сопоставление столбца 'k' заданным чем-то иным, чем utf8_general_ci?
-
Убедитесь, что SELECT k из имен ORDER BY k ASC дает правильный ответ
-
Был ли изменен файл Index.xml в MySQL, чтобы изменить значение
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?
Предположительно, кто-то еще изменил одну из этих вещей для какой-то гнусной цели...
Ответ 2
Мне может быть что-то здесь не хватает... но вы не можете просто сделать функцию (скажем removeAccents
), которая берет строку и возвращает эквивалентную строку без акцента, а затем сортирует ее по removeAccents(field)
. Я считаю, что вы также можете создать индекс для этого, что должно помочь в производительности.