1

我有一个数据库,其中包含使用各种不同字符的城市名称,从 åäö 到越南标志。地名都是大写的,例如“New York”和“Aix En Provence”。

我现在的问题是尝试在使用 postgresql 的 Heroku 中搜索这些城市名称。

p = Place.where("upper(name) LIKE '%" + place_name_searched.to_s.upcase.tr('åäöüñï','ÅÄÖÜÑÏ') + "%'").first

这是我想出的最好的方法,但它只是对 åäö 等的修复,并没有捕捉到所有 100 多个不同的字符,例如“é”。解决方案是不再填写该字符串。

一个普遍的问题是 upper(name) 似乎可以很好地翻译所有内容,但 upcase 只能处理英文字母。所以相应的搜索将是 .where("TÄBY like 'TäBY') if place_name_searched = 'täby'。

那么,如何将诸如“Täby”和“Jidd Ḩafş”之类的 postgresql 条目与用户输入的小写字符串(“täby”、“jidd hafs”)相匹配?

在我的应用程序的 Mysql 版本中一切正常,但是一旦我上传到 Heroku,一切都会失败。

4

1 回答 1

2

Postgres 有一个名为“ILIKE”的扩展,用于不区分大小写的模式匹配。

p = Place.where("upper(name) ILIKE '%" + place_name_searched.to_s.upcase.tr('åäöüñï','ÅÄÖÜÑÏ') + "%'").first

但请注意,这只适用于 Postgres,因此您需要检查您正在运行的环境,以决定是否使用这个环境而不是常规环境。

于 2012-05-04T12:11:57.363 回答