2010-03-05 49 views
11

我試圖在MySQL中實現重音和不區分大小寫的排序。按照手冊中的說明,應該使用utf8字符集和utf8_general_ci歸類。MySQL中對口音不敏感的排序

當我跟隨在手動(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'的重音並將其排序。任何想法我做錯了什麼?

+0

請你從'SHOW FULL列添加到您的問題的輸出從測試;' – 2010-03-05 19:27:38

+1

我得到了所有1選擇,所以在MySQL中你的排序規則肯定有問題。 –

+1

控制檯在哪裏輸入所有配置爲處理UTF-8鍵盤輸入的測試? –

回答

0

我可能失去了一些東西......但你不能只是做一個函數(比如removeAccents)通過removeAccents(field)接受一個字符串,返回非重音等價的字符串,然後排序。我相信你也可以創建一個索引,這應該有助於提高性能。

2

它適用於我的默認MySQL安裝。由於您未提供來自測試(@fsb註釋)的SHOW FULL COLUMNS,因此仍然可能表結構中的排序規則不正確。

  • 是否將列'k'的排序規則設置爲除utf8_general_ci之外的其他值?

  • 檢查從名稱順序選擇ķ用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是什麼意思?

可以想象別人已經調整了這些東西對於某些邪惡目的一個...