PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Неправилно сортиране/съпоставяне/подреждане с интервали в Postgresql 9.4

На Unix/Linux SE приятелски експерт обясни, че това, което виждате, е правилният начин за сортиране на Unicode. По принцип стандартът се опитва да сортира:

di Silva Fred                  di Silva Fred
di Silva John                  diSilva Fred
diSilva Fred                   disílva Fred
diSilva John         ->        di Silva John
disílva Fred                   diSilva John
disílva John                   disílva John

Сега, ако интервалите бяха толкова важни, колкото буквите, сортът не можеше да раздели различните идентични изписвания на Фред и Джон. Така че това, което се случва, е, че първо се сортира без интервали. След това при второ преминаване се сортират низове, които са еднакви без интервал. (Това е опростяване, истинският алгоритъм изглежда доста сложен, като присвоява интервали, акценти и непечатаеми знаци на различни нива на приоритет.)

Можете да заобиколите съпоставянето на Unicode, като зададете:

export LC_ALL=C

Или в Postgres чрез прехвърляне към байтов масив за сортиране:

order by name::bytea

Или (от отговора на Kiln), като посочите C съпоставяне:

order by name collate "C"

Или чрез промяна на съпоставянето по подразбиране за колоната:

alter table products alter column name type text collate "C";



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Скорост на съкращаване на Postgresql

  2. Намерете редове, където текстовият масив съдържа стойност, подобна на въведената

  3. Как да закръглим до най-близките X минути с PL/pgSQL?

  4. Как да добавите брой работни дни към дадена дата

  5. AMD, Intel и PostgreSQL