2012-10-18 17 views
2

我想要:如何在mysql中進行搜索以使重音字符與非重音相同?

piščanec= piscanec在mysql中。我的意思是,我想搜索piscanec找到piščanec也。

所以C和C是相同的,S和S等..

我知道它可以使用正則表達式來完成,但這是緩慢:-(與像任何其他辦法嗎?我也是用全文搜索了很多

UPDATE:。

select CONVERT('čšćžđ' USING ascii) as text 

不起作用產地:?????

+0

čšćžđ非ASCII字符,所以它是有道理的,他們被轉換成????? ;) – Joni

+0

是的,但這是其中一個答覆的建議。 – Jerry2

回答

2

聲明列爲排序utf8_generic_ci。此歸類認爲能勝任S和C等於C:

create temporary table t (t varchar(100) collate utf8_general_ci); 
insert into t set t = 'piščanec'; 
insert into t set t = 'piscanec'; 
select * from t where t='piscanec'; 
+------------+ 
| t   | 
+------------+ 
| piščanec | 
| piscanec | 
+------------+ 

如果你不想或者不能使用utf8_generic_ci排序規則列 - 也許你對列的唯一索引和要考慮piščanec和piscanec不同 - 你可以只在查詢中使用排序規則:?

create temporary table t (t varchar(100) collate utf8_bin); 
insert into t set t = 'piščanec'; 
insert into t set t = 'piscanec'; 
select * from t where t='piscanec'; 
+------------+ 
| t   | 
+------------+ 
| piscanec | 
+------------+ 
select * from t where t='piscanec' collate utf8_general_ci; 
+------------+ 
| t   | 
+------------+ 
| piščanec | 
| piscanec | 
+------------+ 

全文索引應該直接使用列排序規則;您不需要定義新的排序規則。顯然,全文索引只能在列的存儲整理,所以如果你想使用utf8_general_ci搜索並utf8_slovenian_ci進行排序,你必須使用使用collate順序爲:

select * from tab order by col collate utf8_slovenian_ci; 
+0

我不能使用general_ci,因爲然後我會得到所有的查詢從這個領域將對待c和č是相同的,會造成類似的問題:čebula,česen,cvet。但是cvet應該是第一個,因爲c是在排序之前。 – Jerry2

+0

如果我使用collat​​e utf8_general_ci,我確實從LIKE查詢中獲得了我想要的結果。我不知道這是多慢(必須嘗試)以及它如何影響全文搜索。在那裏我也需要使用整理我猜別的piščanec!= piscanec。 – Jerry2

+0

好的是,即使我整理查詢,仍然使用斯洛文尼亞語整理排序。呵呵。 – Jerry2

2

這不是直截了當的,但你最好爲你的全文搜索創建自己的排序規則。這裏有一個例子:

http://dev.mysql.com/doc/refman/5.5/en/full-text-adding-collation.html

更多的信息在這裏:

http://dev.mysql.com/doc/refman/5.5/en/adding-collation.html

這樣一來,你有你整理的邏輯完全獨立的SQL和業務邏輯的,而你不必須使用SQL變通辦法來解決你自己的問題。

編輯:因爲排序規則用於所有字符串匹配操作,這可能不是最好的方法:你最終會混淆是語言上的離散字符之間的差異。

如果要針對特定​​操作抑制這些差異,則可以考慮編寫一個函數,該函數接受一個字符串並以目標方式替換爲了當前操作目的而被視爲相同的字符。

你可以定義一個包含基本字符(š,č等)的表格,另一個表格包含等價物。然後在您的字符串上運行REPLACE。

另一種方式僅僅是CAST你的字符串ASCII,從而抑制所有非ASCII字符。

例如

SELECT CONVERT('<your text here>' USING ascii) as as_ascii 
+0

謝謝。在這一秒,我只是閱讀該頁面,如果它可以幫助。我認爲排序只是爲了排序,而不是其他的東西,我想我需要閱讀它。此排序規則僅適用於全文搜索還是使用此mysql的服務器上的所有內容? – Jerry2

+0

排序規則處理字符串匹配(從而隱式排序),因此它應該適合您的需求。你只需要實現一次,數據庫在需要字符串匹配的地方使用它。看到這裏:http://dev.mysql.com/doc/refman/5.5/en/charset-general.html – davek

+0

嗯,謝謝,這似乎很複雜。我使用unicode utf-8作爲我們的字符集,但我們使用拉丁文8859-2和MS1250(鍵盤上)的字符,所以uft-8是最佳選擇,我還沒有發現是否可以更改排序規則。問題是我不想影響sortiong,c出現在c後面,它不一樣,我只想搜索找到c和sak(移動電話通常沒有出字母)。 – Jerry2