PostgreSQL игнорирует тире при заказе - PullRequest
3 голосов
/ 10 февраля 2011

У меня есть база данных PostgreSQL 8.4, созданная с использованием языка da_DK.utf8.

dbname=> show lc_collate;
 lc_collate
------------
 da_DK.utf8
(1 row)

Когда я выбираю что-то из таблицы, где я делаю заказ на столбец с символами, меняющимися, я получаю странное поведение IMO.При упорядочении результата PostgreSQL игнорирует дефисы, которые префиксируют значение, например:

 select name from mytable order by name asc;

Может возвращать что-то вроде

 name
 ----------------
 Ad...
 Ae...
 Ag...
 - Ak....
 At....

Префикс тире, похоже, игнорируется.

Я могу решить эту проблему, преобразовав столбец в латиницу1 при заказе:

 select name from mytable order by convert_to(name, 'latin1') asc;

Ожидаемый результат получается следующим образом:

 name
 ----------------
 - Ak....
 Ad...
 Ae...
 Ag...
 At....

Почему префикс тире по умолчанию игнорируется?Можно ли изменить это поведение?

Ответы [ 3 ]

4 голосов
/ 10 февраля 2011

Это потому, что da_DK.utf8 locale определяет его таким образом.Утилиты, поддерживающие локали Linux, например, sort, также будут работать следующим образом.

Ваш convert_to(name, 'latin1') сломается, если найдет символ, который не находится в наборе символов Latin 1, например, , поэтомуне хороший обходной путь.

Вы можете использовать order by convert_to(name, 'SQL_ASCII'), который будет игнорировать сортировку, определяемую локалью, и просто использовать байтовые значения.


Редактирование безобразного хака:

order by
  (
    ascii(name) between ascii('a') and ascii('z')
    or ascii(name) between ascii('A') and ascii('Z')
    or ascii(name)>127
  ),
  name;

Это отсортирует сначала все, что начинается с буквы ASCII.Это очень уродливо, потому что сортировка в строке будет вести себя странно, но это может быть достаточно для вас.

1 голос
/ 10 февраля 2011

Обходной путь, который будет работать в моем конкретном случае, - это заменить черточки восклицательными знаками.Я знаю, что никогда не получу восклицательные знаки, и они будут отсортированы перед любыми буквами или цифрами.

select name from mytable order by translate(name, '-', '!') asc

Это, безусловно, повлияет на производительность, поэтому я могу посмотреть на создание специального столбца для сортировки, но я действительноэто тоже не нравится ...

0 голосов
/ 10 февраля 2011

Я не знаю, как выглядит порядок упорядочивания для голландского, но для польских специальных символов, таких как пробел, тире и т. Д., Не "учитываются" при сортировке в большинстве словарей.Некоторые хорошие процедуры сортировки делают то же самое и игнорируют такие специальные символы.Вероятно, на нидерландском языке есть подобное правило, и это правило реализовано с помощью функции сортировки, поддерживающей локали Ubuntu.

...