【问题标题】:Specify Postgresql DB default collation for a Rails project为 Rails 项目指定 Postgresql DB 默认排序规则
【发布时间】:2016-04-04 20:38:42
【问题描述】:

我有一个 Rails 4.2+ 和 Postgres 9.4 项目,我需要更改 Postgres 在查询中排序项目的方式。默认设置似乎忽略了空格,我需要一个将空格考虑在内的策略。在 psql 中运行\l 后,我看到数据库将Collate 设置为en_US.UTF-8Ctype 设置为en_US.UTF-8

于 2015 年 12 月 30 日下午 4:14 更新

我有以下活动,其名称列具有以下名称:

Code1A East
Code1A West
Code1 AEast
Code1 AWest 

当我在 Rails 中执行以下查询时

Activity.order(name: :asc)

我希望按以下顺序返回活动列表。

Code1 AEast
Code1 AWest 
Code1A East
Code1A West

甚至可能

Code1A East
Code1A West
Code1 AEast
Code1 AWest 

我得到了

Code1A East
Code1 AEast
Code1A West
Code1 AWest

它似乎忽略了名称中的空格。我在下面的评论中指出,通过将以下内容添加到 database.yml,我能够让 Rails 应用程序创建具有特定排序规则的数据库

development:
  ...other keys...
  encoding: utf8
  collation: sv_SE.UTF-8
  ctype: sv_SE.UTF-8
  template: template0

但我不知道哪种排序规则设置会选择“更好”的排序顺序。

【问题讨论】:

  • 排序是 PostgreSQL 特定的吗? This SO 主题可能会有所帮助。每次运行查询时,您都可以为每个模型指定默认顺序。
  • 这是一个我想在数据库级别纠正的问题。
  • 请发布一个与您的期望不符的查询结果示例。默认情况下排序不会忽略空格。

标签: ruby-on-rails postgresql ruby-on-rails-4


【解决方案1】:

Postgres 上的排序规则设置由服务器决定,而不是您与它的连接,per the Postgres docs,因此无法将其设置为 database.yml 中的设置。要永久更改该值,您需要永久修改您的服务器。

但是,您可以通过以下几种方式强制针对每个查询使用不同的排序规则:

SELECT * FROM things ORDER BY name COLLATE "C" ASC;

将使用C 排序规则,这可能是您正在寻找的,并完成与以下相同的结果:

SELECT * FROM things ORDER BY name USING ~<~;

(请参阅this SQLfiddle 以获取实时示例)

希望有帮助!

【讨论】:

  • 我刚刚尝试将encoding: utf8, collation: sv_SE.UTF-8, template: template0添加到database.yml中的开发组,并重新创建了数据库,我可以在DB上看到新的排序规则设置。
  • @CodeKing:当然,但该设置只会在您重建服务器时更改。例如,如果您在 Heroku 或 AWS 中预置一个新数据库,这些设置可能不会受到尊重(因此在部署到生产环境时要小心!)。
猜你喜欢
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 2012-03-27
  • 2023-03-22
  • 1970-01-01
  • 2011-10-09
相关资源
最近更新 更多