2015-12-31 46 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使用正确的绑定,但是当你明白自己在做什么并且以最小的努力开箱即可工作时,上述操作就可以实现。