2013-10-26 52 views
2

我發現很多關於整理和重音不敏感搜索的答案,閱讀1000篇有關此問題的帖子和文章,但沒有找到答案。MySQL - 使用波蘭語字符進行區分重音的搜索 - UTF8

有沒有人知道如何強制MySQL搜索與所有波蘭語字符不區分?也許有人得到了一個編譯的排序文件(Debian)?

請注意,:

  • 設置整理到utf8_general_ci沒有幫助。它不正確地支持Ł。但它確實破壞了搜索順序。
  • 設置排序規則爲utf8_unicode_ci沒有幫助。同上。
  • 編輯排序規則文件是不可能的,因爲它是多字節編碼。並且必須編譯多字節字符集。
  • 將所有不支持的字母替換爲支持的字母不是解決方案。

我真的不明白爲什麼MySQL的工作人員不會將此威脅視爲一個錯誤。很明顯,它已經存在了很多年了。自4.xx他們確實正確Ś信...所以爲什麼不Ł?!

我發現了一些對This MySQL functionality的引用,但沒有關於如何使用它的信息。我真的不明白在那裏寫什麼,如果它能幫助我。

測試:

mysql> show full columns from test; 
+-------+--------------+----------------+------+-----+---------+-------+---------------------------------+---------+ 
| Field | Type   | Collation  | Null | Key | Default | Extra | Privileges      | Comment | 
+-------+--------------+----------------+------+-----+---------+-------+---------------------------------+---------+ 
| str | varchar(255) | utf8_polish_ci | YES |  | NULL |  | select,insert,update,references |   | 
+-------+--------------+----------------+------+-----+---------+-------+---------------------------------+---------+ 

mysql> insert into test values('Łomża'); 

...

mysql> select str from test where str like '%Łomża%'\G 
*************************** 1. row *************************** 
str: Łomża 

mysql> select str from test where str like '%Łomza%'\G 
Empty set (0.00 sec) 

-- 

mysql> select str from test where str like '%Łomza%' collate utf8_general_ci\G 
*************************** 1. row *************************** 
str: Łomża 

mysql> select str from test where str like '%Lomza%' collate utf8_general_ci\G 
Empty set (0.00 sec) 

-- 

mysql> select str from test where str like '%Łomza%' collate utf8_unicode_ci\G 
*************************** 1. row *************************** 
str: Łomża 

mysql> select str from test where str like '%Lomza%' collate utf8_unicode_ci\G 
Empty set (0.00 sec) 
+0

我不明白,爲什麼Ł是一個問題,我們甚至用強大的4字節漢字表示MySQL來進行搜索? – jacouh

+0

詢問MySQL的開發者。並且他們不認爲它是一個錯誤!過去5年報告爲10萬次,官方的答案是這不是一個錯誤。請檢查附加的例子。我編輯了問題。 –

+0

我不能幫你,因爲我沒有擦亮控制檯。你使用select str來測試,比如'%Łomża%'\ G;爲什麼你要用str來檢索select str,比如'%Łomza%'\ G,這在邏輯上返回一個空集?我插入str作爲utf8_general_ci,like運算符似乎通過PHP/PDO/MySQL工作。 – jacouh

回答

0

我建議在做另一列在您的數據庫中搜索,如 'str_search'。當你的數據庫中插入字符串「str_search」,使在PHP中使用的功能,像這樣:

function convertPolishChars($phrase) 
{ 
    $phrase = str_replace("ą", "a", $phrase); 
    $phrase = str_replace("Ą", "A", $phrase); 

    $phrase = str_replace("ć", "c", $phrase); 
    $phrase = str_replace("Ć", "C", $phrase); 

    $phrase = str_replace("ę", "e", $phrase); 
    $phrase = str_replace("Ę", "E", $phrase); 

    $phrase = str_replace("ł", "l", $phrase); 
    $phrase = str_replace("Ł", "L", $phrase); 

    $phrase = str_replace("ń", "n", $phrase); 
    $phrase = str_replace("Ń", "N", $phrase); 

    $phrase = str_replace("ó", "o", $phrase); 
    $phrase = str_replace("Ó", "O", $phrase); 

    $phrase = str_replace("ś", "s", $phrase); 
    $phrase = str_replace("Ś", "S", $phrase); 

    $phrase = str_replace("ź", "z", $phrase); 
    $phrase = str_replace("Ź", "Z", $phrase); 

    $phrase = str_replace("ż", "z", $phrase); 
    $phrase = str_replace("Ż", "Z", $phrase); 

    return $phrase; 
} 

"INSERT INTO test (str, str_search) VALUES ('Łomża', '" . convertPolishChars('Łomża') . "')" 

,寫一個SQL查詢時,寫類似:

"SELECT str FROM test WHERE str_search like '%" . convertPolishChars('Łomża') . "%'" 

這種方法將執行你的查詢字符串要快得多,而不是在SQL語句中進行任何轉換。

確保索引你的'str_search'列。

對於較大的數據庫,我建議FULLTEXT搜索與對陣http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html