Как получить ближайший символ, который больше указанного в postgresql? - PullRequest
1 голос
/ 11 октября 2011

Мне нужно получить ближайший характерный для локали символ, который больше (с точки зрения сравнения строк) заданного в postgresql. Я пытался использовать

SELECT chr(ascii(x)+1);

Но когда я проверяю его, он иногда не работает так, как я хочу, для

SELECT chr(ascii('я')+1);

возвращает ѐ, но

SELECT 'я' < 'ѐ';

возвращает FALSE.

Ответы [ 2 ]

1 голос
/ 11 октября 2011

Порядок сортировки текста зависит от lc_collate, а не от кода ASCII или кодовой точки Unicode.В большинстве локалей это происходит рука об руку с основными символами ASCII.Остальные могут отличаться.

Какое у вас значение show lc_collate?

Ожидаемое поведение работает только с языком C.Прочитайте все об этом в прекрасном руководстве :

Оба сопоставления C и POSIX задают поведение "традиционного C", в котором только буквы ASCII от "A" до "Z"обрабатываются как буквы, а сортировка выполняется строго по значениям байтов кода символа .

Акцент мой.В PostgreSQL 9.1 есть несколько новых функций для сопоставления.

0 голосов
/ 11 октября 2011

В локалях, отличных от C / POSIX, это обычно невозможно без исчерпывающего поиска. Вам лучше пересмотреть свое требование.

Если на практике вы имеете дело только с ограниченным пространством проблем, например с русским или латинским алфавитом, я предлагаю вам разместить в своем приложении явный список букв. Но если вам нужно, чтобы это работало с произвольными символами или строками Юникода, у вас возникнут некоторые проблемы.

...