UPPER () не работает с кириллическими символами в базе данных PostgreSQL 8.2 - PullRequest
1 голос
/ 26 декабря 2011

У меня PostgreSQL 8.2 работает на сервере Ubuntu, кодировка базы данных - UTF8. Все хорошо, кроме одного: я не могу использовать функцию upper() в запросах SQL для кириллических символов. Ну, я могу использовать его, но результат функции будет по-прежнему в нижнем регистре.

Как это можно исправить?

Ответы [ 3 ]

2 голосов
/ 27 декабря 2011

Это может быть исправлено путем обновления вашей версии PostgreSQL, предпочтительно до текущей версии 9.1.PostgreSQL 8.2 был выпущен в 2006 году и недавно достиг конца срока службы .

С тех пор было много улучшений для локалей.Насколько я вижу, это работает для меня в версии 9.0 (в Debian Squeeze):

SELECT upper('ѓғг̡г̨һһ̨дђеёӗ');

Результат:

ЃҒГ̡Г̨ҺҺ̨ДЂЕЁӖ

Примечание: я использую UTF8 как server_encoding, UNICODE как client_encoding и *.UTF-8 (точнее de_AT.UTF-8) для всех настроек локали (lc_*).Другие кодировки или локали могут иметь специфические проблемы.Возможно, вы захотите показать нам результат этого запроса:

SELECT * FROM pg_settings WHERE name ~~ '%encod%' OR name ~~ 'lc%'

Редактировать после обратной связи в комментариях:

Если установлено «ничего», это означает псевдо-локаль C (он же Posix) установлен.C не зависит от настроек локали, что позволяет быстрее выполнять операции сортировки.Это также означает, что ваша система не знает, каким должен быть эквивалент кириллицы в верхнем регистре.

Обязательно прочитайте главу Поддержка локалей в руководстве.(Ссылки на версию 8.2, текущая версия здесь .)

Однако, LC_CTYPE можно установить только во время создания кластера БД.В более новых версиях вы можете основать новую базу данных на template0 и указать другие локаль и параметры кодировки, но не в версии 8.2.

Итак, я возвращаюсь к своему первоначальному совету: лучший способ действий состоит в том, чтобыустановить более новую версию PostgreSQL.И не забудьте установить желаемый языковой стандарт при настройке нового кластера базы данных.

PostgreSQL 9.1 доступен для Debian Squeeze .Так что должно быть что-то и для Ubuntu.

0 голосов
/ 27 декабря 2011

Правила сопоставления, которые являются частью языкового стандарта , отвечают за определение того, как преобразовать строчные буквы в прописные и наоборот Проверьте свой!

0 голосов
/ 27 декабря 2011

Это может быть что-то о наборе символов .


Чтобы избежать этой проблемы, вы можете сделать upper function самостоятельно.

Как видно здесь это следует сделать, добавив единицу к значению ascii chacacter.

128 80 строчная кириллица dje

129 81 строчная кириллица DJE

Или Вы можете иметь таблицу преобразования и сравнить значение и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...