MySQL中对重音不敏感的排序

时间:2010-03-05 18:17:49

标签: mysql unicode collation

我试图在MySQL中实现重音和不区分大小写的排序。按照手册中的说明,这应该与utf8字符集和utf8_general_ci排序规则一起使用。

当我按照“Unicode多字节字符集的排序规则”下的手册(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 个答案:

答案 0 :(得分:2)

它适用于我的默认MySQL安装。由于您没有从test(@fsb注释)中提供SHOW FULL COLUMNS,因此表结构中的排序规则仍然可能不正确。

  • 列'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?
  • 的含义

可以想象,其他人为了一些邪恶的目的而调整了其中一件事......

答案 1 :(得分:0)

我可能在这里遗漏了一些东西......但你不能只是创建一个函数(比如removeAccents),它接受一个字符串并返回非重音等效字符串,然后按{{1}排序}。我相信你也可以为它创建一个索引,这应该有助于提高性能。