2011-08-19 76 views
2

編輯:如果你在這裏是因爲你被MySQL中的波蘭語排序混淆,read this強調不敏感的搜索/ utf8_general_ci排序問題

我試圖在波蘭城市的一張桌子上進行全文搜索,其中許多都包含重音字符。它意味着用於ajax調用自動完成,所以如果搜索不區分重音,它會很好。我已將行的排序規則設置爲ut8_polish_ci。現在,鑑於城市「Zelów」,我查詢這樣的數據庫

SELECT * FROM cities WHERE MATCH(city) AGAINST ("zelow")

但無濟於事。 Mysql返回一個空的結果。我嘗試了不同的口音,嘗試在查詢中添加不同的排序規則,但沒有任何幫助。我不知道我應該如何處理這個問題,因爲口音敏感度似乎記錄不準確。有任何想法嗎?


編輯

所以我發現,不區分大小寫的全文搜索僅在布爾模式下進行,所以正確的查詢是

SELECT * FROM cities WHERE MATCH(city) AGAINST ("zelow" IN BOOLEAN MODE)

以前我不以爲然由於a misleading comment on dev.mysql.com。可能還有更多,但我現在只是很困惑。

無論如何,正如下面的評論中所提到的,我在城市專欄中使用了UNIQUE索引,因此將表格整理爲不區分重音的utf8_general_ci是不成問題的。然而

我意識到,下面的查詢工作的很好的一個表utf8_polish_ci歸類:

SELECT * FROM cities WHERE city LIKE 'zelow' COLLATE utf8_general_ci

它現在似乎是最合理的解決方案將是一個類似於做全文搜索時尚:

SELECT * FROM cities WHERE MATCH(city) AGAINST ('zelow' IN BOOLEAN MODE) COLLATE utf8_genral_ci

然而,這會產生以下錯誤:

#1253 - COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'binary'

這真的開始讓我神經緊張。還不如放棄全文搜索,取而代之的是簡單等,其中的做法,但它似乎並不明智表中的幾乎50K的記錄將被強烈質疑......


最後的編輯 好吧,布爾模式的事情是部分廢話。只是部分因爲它的確如我所說的那樣工作,但是,在utf8_general_ci上它反過來工作。我完全困惑,無法進一步研究這個問題。我決定放棄UNIQUE索引(無論如何不再增加更多的城市,因此不需要做大量的工作),並堅持使用utf8_general_ci表格歸類。我感謝所有的幫助,它讓我朝着正確的方向前進。

回答

0

如果你嘗試:

select * from cities where cityname like 'zelow' 
+1

按照Vache的說法......我檢查了我的數據庫,排序規則是utf_general_ci。和一切按預期工作 – Cygnusx1

3

您整理更改爲utf_general_ci。它在搜索和排序時忽略了重音,但仍能正確存儲它們。

+0

問題是,存儲城市名稱的列有一個唯一的關鍵。像Ostrowik和Ostrówik這些完全不同的城市呢?如果我將排序規則更改爲utf8_general_ci,則mysql會抱怨此列上存在重複條目。所以我想在表格中保留當前的排序規則,但只執行不區分重音的搜索。我試圖在查詢的末尾添加「COLLATE utf8_general_ci」,但是mysql說「#1253 - COLLATION'utf8_general_ci'對於CHARACTER SET'binary'無效」「 –

+0

看看[this question](http://stackoverflow.com/questions/901066/mysql-case-sensitive-search-for-utf8-bin-field)可以幫助你。 – Vache

+0

謝謝,但我已經用google搜索了一下: –

2

MySQL在編碼/整理領域非常靈活,可能過於靈活。更改編碼/排序規則時,請確保您正在轉換表格,而不僅僅是更改編碼/排序規則類型。

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

您還可以將單獨的領域,所以你的表可以有utf8_general_ci的排序規則設置,但是讓他們使用一些其他的排序,你可以改變一個或多個字段。根據你所看到的「二進制」錯誤,看起來你的文本字段可能有一個UTF8-BIN的排序規則(或是一個BLOB)。你能發表CREATE TABLE的結果嗎?請記住,CHARACTER SET(編碼)是數據如何存儲的,排序規則是如何編制索引的。並非所有的組合都有效

我原來的問題,以及問題,可能會有點幫助: Converting mysql tables from latin1 to utf8

+0

我們在談論稍微不同的事情,我希望我的表是utf8_polish_ci以確保正確的存儲和排序,但仍然能夠執行全屏顯示,文本搜索使用不同的排序規則,表格的字符集是UTF8,這不可能是一個mysql錯誤或者我不理解的一個功能,你可以自己嘗試:CREATE TABLE'test'(' name' VARCHAR(10)NOT NULL)ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_polish_ci;並嘗試執行全文搜索SELECT * FROM'test' WHERE MATCH('name')AGAINST('whatever')COLLATE utf8_general_ci; –

+0

你可能想要做的就是把字段改爲utf8_polish_ci,所以表格應該是utf8_general_ci,但是這個字段是一個不同的排序規則,你可以做一個改變表格並且改變一個字段的排序規則,儘管UT F8通常以您想要的方式處理重音字符。 –

0

從二元到utf8_bin更改排序規則。 utf8_bin應與utf8_general_ci兼容,但仍允許您存儲具有不同重音的城市名稱。