2017-05-30 67 views
2

當代碼會告訴勝於言:爲什麼ruby對字符串數組的排序與sql order(postgres)不同?

[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中相同的數組排序,並得到了相同的結果紅寶石給我。我現在想知道,是否有某種排序字符串的標準,還是實現的細節?

+1

「Peters-Koster」ascii 45還是長破折號? – DavidC

+1

與[編碼或整理](https://www.postgresql.org/docs/9.5/static/locale.html)配置您的Postgres服務器,可能是什麼? –

+0

@DavidC不幸的是,環境發生了變化,我無法檢索到相同的結果來準確回答。但是我試圖在數據庫中插入與我在此處發佈的數據相同的數據,並且我已經獲得了相同的時間順序。所以我想這是因爲[unicode短劃線](https://en.wikipedia.org/wiki/Dash)?看來Ruby正常化了這樣的字符串。 –

回答

2

根據ASCII碼對ruby中的字符串進行排序。

對pg中文本的排序行爲取決於您的語言環境的當前排序規則。來自PostgreSQL wiki - Why do my strings sort incorrectly?

它不是ASCII /字節順序。不,不是,它不應該是。 ASCII是一種編碼,而不是排序順序。如果你想這樣做,你可以使用C語言環境 ,但是你可以使用非ASCII字符的能力。

所以在普通的SQL由ASCII值排序,而不是正確地本地化排序如下您當地的語言規則,你可以使用COLLATE子句中查詢

order by name COLLATE "C" ASC 

您可以檢查您整理設置psql與SHOW lc_collate;

PostgreSQL使用操作系統整理支持,因此結果可能會略有不同,從主機操作系統到主機操作系統。某些版本的Mac OS X或BSD家族操作系統在區域設置定義方面存在問題。