2015-12-31 47 views
1

我有和here一樣的問題。但由於沒有足夠的學分而無法評論,因此產生了新的問題。Ruby:根據數據庫校對比較兩個字符串utf8_general_ci

反正問題是:

我想在Ruby中兩個字符串比較類似的方式MySQL如何 比較兩個字符串整理utf_general_ci。

要進入具體而言,當以dB爲單位選擇了整理utf_general_ci,在mysql治療'a' and 'ä'same在執行查詢。由於我想要批量插入,我將所有名稱(使用utf_general_ci整理的列)拖入ruby腳本中,如果不存在名稱,則插入語句。但在ruby的比較中,'a' and 'ä'等字符被視爲different。但是我希望比較的實現方式類似於mysql如何在utf_general_ci歸類的情況下進行。

在老問題中有一個使用'iconv'的答案,它在1.9.3之後棄用。所以我認爲String#encode應該用於做同樣的事情。但無法找到如何複製該行爲的確切方式。

+0

爲什麼不簡單地發出MySQL命令來進行比較? –

+0

@RickJames yah我可以發出MySQL命令來首先搜索是否存在,如果不存在則插入表中。但是,自從我擁有大量數據以來,這太過浪費時間了。所以多數民衆贊成爲什麼我試圖形成一批插入語句,然後上傳到MySQL數據庫。 – santoshthota

+0

'INSERT ... ON DUPLICATE KEY UPDATE ...'避免在插入之前檢查一行是否存在。 –

回答

1

AFAIK,目前還沒有直接的方式來做這個紅寶石。另一方面,人們可以簡單地用手去做。忍者的方式是使用icu這個庫。

說實話,你可能想要最簡單的方法,唯一的目標是比較字符串,可以開始擺脫重音。口音有兩種可能性:combining diacriticallatin supplement。後者是Latin1/ISO-8859-1編碼的遺產。

擺脫結合變音符號很容易:

▶ "lätin1, cömbined".gsub(Regexp.new(("\u0300".."\u036f").to_a.join('|')), '') 
#⇒ "lätin1, combined" 

OK,這是最容易的部分。不幸的是,沒有直接的方式來獲得的遺產的latin1字符映射到它們的重音等價物,所以人們會需要引入它自己:

▶ substs = "ÀÁÂÃÄÅ".split(//).product(['A']).to_h 
# for the sake of focusing on the problem, the other symbols are dropped 

現在比較可能做到爲:

▶ "lÄtin1, cömbined".gsub(Regexp.new(("\u0300".."\u036f").to_a.join('|')), '') 
        .gsub(Regexp.new(substs.keys.join('|')), substs) 
#⇒ "lAtin1, combined" 

因此,兩個字符串可能會「dediacritized」,然後進行比較。

請注意,我承認這種做法是錯誤的。一個人應該對icu library使用正確的綁定,但是當你明白自己在做什麼並且以最小的努力開箱即可工作時,上述操作就可以實現。