Почему я не могу сделать "upper ()" в моей базе данных PostgreSQL? - PullRequest
2 голосов
/ 18 января 2009

Я создал базу данных в PostgreSQL с "encoding = 'UTF8'" и загрузил в нее некоторые данные UTF8. Выбор работает нормально, но когда я пытаюсь сделать "WHERE UPPER (name) = 'FOO'" в запросе, я получаю ошибку

ERROR:  invalid multibyte character for locale

Похоже, что мое исследование показывает, что это потому, что установка PostgreSQL была "initdb" с LANG=en_US, а не LANG=en_US.UTF8. Выполнение «SHOW LC_COLLATE» показывает «en_US». Я не хочу создавать дампы и воссоздавать все мои базы данных, потому что некоторые из них являются PostGIS, и воссоздать их очень сложно. Есть ли обходной путь, например, способ сделать эквивалент "UPPER", который работает для UTF8?

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

Ответы [ 2 ]

1 голос
/ 18 января 2009

Ваша диагностика верна, это обычная проблема с Unicode в PostgreSQL. Процедура установки пыталась быть умной и инициализированной с языком оболочки, в которой она запущена: - (

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

1 голос
/ 18 января 2009

Я не думаю, что нужный вам обходной путь возможен, но дамп и восстановление ваших баз данных с поддержкой PostGIS должны работать нормально. Я регулярно сбрасываю и восстанавливаю базы данных с помощью функций PostGIS, а данные с помощью объектов geom.

Какие у вас проблемы?

...