为什么ruby排序字符串数组的方式与sql order(postgres)不同?

时间:2017-05-30 16:28:46

标签: sql ruby postgresql

当代码比言语更好:

[4] pry> Models::Company.order(:name).select_map(:name)
=> ["Dekker, Jacobs and Bosch", "Koster en Zonen", "Peters-Koster", "Peters, Vries and Smits", "Wal, Linden and Jacobs"]
[5] pry> Models::Company.order(:name).select_map(:name).sort
=> ["Dekker, Jacobs and Bosch", "Koster en Zonen", "Peters, Vries and Smits", "Peters-Koster", "Wal, Linden and Jacobs"]

因此我的规格随机失败。我可以在比较之前规范化数组,如下所示:

result_names.map { |s| s.gsub(/,|-/, '') }

我尝试在JavaScript中对相同的数组进行排序,并得到了与Ruby给我相同的结果。我现在想知道,是否有某种排序字符串的标准,还是实现的细节?

1 个答案:

答案 0 :(得分:3)

基于ASCII码对ruby中字符串的行为进行排序。

pg中文本的排序行为取决于您的语言环境的当前排序规则。来自PostgreSQL wiki - Why do my strings sort incorrectly?

  

它不是ASCII /字节顺序。不,它不是,它不应该是。   ASCII是一种编码,而不是排序顺序。如果你想要这个,你可以使用   C语言环境,但是你可以使用非ASCII字符的功能。

因此,在纯SQL中按ASCII值排序,而不是按照本地语言规则进行正确的本地化排序,您可以在查询中使用COLLATE子句

order by name COLLATE "C" ASC

您可以使用SHOW lc_collate;检查psql中的整理设置。

PostgreSQL使用操作系统归类支持,因此结果可能会因主机操作系统与主机操作系统略有不同而异。某些版本的Mac OS X或BSD系列操作系统在区域设置定义方面存在问题。