Mysql Ruby:根据数据库排序规则utf8\u general\u ci比较两个字符串

Mysql Ruby:根据数据库排序规则utf8\u general\u ci比较两个字符串,mysql,ruby-on-rails,ruby,database,collation,Mysql,Ruby On Rails,Ruby,Database,Collation,我也有同样的问题。但由于没有足够的学分,无法在那里发表评论,因此产生了新的问题 无论如何,问题是: 我想用与mysql相似的方式比较ruby中的两个字符串 将两个字符串与排序规则utf\u general\u ci进行比较 更详细地说,当在数据库中选择排序规则utf\u general\u ci时,mysqltreat'a'和'a'在执行查询时是相同的。因为我想要一个批插入,所以我将所有名称(带有utf_general_ci排序规则的列)拉入ruby脚本,如果不存在名称,则生成insert语句。

我也有同样的问题。但由于没有足够的学分,无法在那里发表评论,因此产生了新的问题

无论如何,问题是:

我想用与mysql相似的方式比较ruby中的两个字符串 将两个字符串与排序规则utf\u general\u ci进行比较

更详细地说,当在数据库中选择排序规则
utf\u general\u ci
时,
mysql
treat
'a'和'a'
在执行查询时是相同的。因为我想要一个批插入,所以我将所有名称(带有utf_general_ci排序规则的列)拉入ruby脚本,如果不存在名称,则生成insert语句。但是在
ruby
中进行比较时,像
'a'和'a'
这样的字符被视为
不同的
。但我希望以类似mysql在utf_general_ci排序中的方式实现比较


在旧问题中,有一个答案使用了
'iconv'
,该答案在1.9.3之后被弃用。因此,我认为应该使用
String#encode
来做同样的事情。但无法找到复制这种行为的确切方法。

好吧,目前在ruby中还没有直接的方法。另一方面,人们可以简单地用手来做。忍者的方法是使用
icu

结果你可能想要最简单的方法,唯一的目标是比较字符串,你可以从消除重音开始。口音有两种可能:和。后者是拉丁1/ISO-8859-1编码的遗留

摆脱组合变音符号很容易:

▶ "lätin1, cömbined".gsub(Regexp.new(("\u0300".."\u036f").to_a.join('|')), '')
#⇒ "lätin1, combined"
好的,这是最简单的部分。不幸的是,没有直接的方法可以将传统拉丁语字符映射到它们的非重音等价物,因此需要亲自介绍:

▶ 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"
因此,可以对两个字符串进行“去IACRITIED”,然后进行比较


请注意,我承认这种方法是错误的。应该使用适当的绑定到,但当您了解自己在做什么,并且只需很少的努力就可以开箱即用时,上面的方法就可以了。

为什么不简单地发出MySQL命令来进行比较?@RickJames yah我可以发出MySQL命令来首先搜索表中是否存在,如果不存在则插入。但由于我有大量的数据,这要花很多时间。这就是为什么我试图形成一批insert语句,然后上传到MySQL数据库。
insert。。。在重复密钥更新时…
避免在插入行之前检查行是否存在。但是对于每个条目,我希望避免“插入”查询,因为它需要很多时间。但是
选择
必须花费时间进行检查。通过结合检查和插入/更新,它实际上节省了时间。如果你能展示你现在的疑问,也许我可以更清楚(或者可能是错的)。