我试图在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'的重音并将其排序。我有什么想法我做错了吗?
答案 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>
可以想象,其他人为了一些邪恶的目的而调整了其中一件事......
答案 1 :(得分:0)
我可能在这里遗漏了一些东西......但你不能只是创建一个函数(比如removeAccents
),它接受一个字符串并返回非重音等效字符串,然后按{{1}排序}。我相信你也可以为它创建一个索引,这应该有助于提高性能。