The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"PostgreSQL отдает данные в UTF вместо KOI8"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы OpenNET: Виртуальная конференция (Public)
Изначальное сообщение [ Отслеживать ]

"PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от _RAW_ email(ok) on 10-Июл-09, 17:25 
FreeBSD 7.2
Понадобилось перевезти сайт с сервера на сервер...
При переносе баз PostgreSQL с сервера на сервер возникли некоторые сложности.

На старой системе было:
PostgreSQL версии 8.2.3
БД postgres в кодировке KOI8
БД users1 в кодировке KOI8
БД users2 в кодировке KOI8

На новом сервере собрал PostgreSQL 8.3.7
БД postgres стала в кодировке UTF8
БД users1 из дампа поднял в кодировке KOI8
БД users2 из дампа поднял в кодировке KOI8

но теперь при запросе данных из баз users1 и users2 они выдаются кракозябами, такое ощущение что Postgres отдает их в UTF8

Попробовал пересобрать PostgreSQL так, чтобы база postgres инициализировалась в KOI8:
собирал из портов, в makefile добавил:
--enable-locale \
--enable-multibyte=KOI8 \
--enable-recode

при инициализации системных таблиц проделал:
/usr/local/etc/rc.d/postgresql initdb --encoding=KOI8 --locale=ru_RU.KOI8-R

все без толку, postgres по прежнему в кодировке UTF8, а данные отдаются кракозябрами...
как заставить собраться постгрес так, чтобы он весь насквозь был в KOI8?
что я не учел?

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от PavelR (??) on 10-Июл-09, 17:28 

ИМХО:

при инициализации БД также где-то учитывается локаль консоли, в которой производится инициализация (у меня лично были эти грабли при запуске полнотекстового поиска). // возможно это не влияет на ввод-вывод данных из БД, в моем случае это проявлялось только при развертывании поиска и на линухе.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от _RAW_ email(ok) on 10-Июл-09, 17:35 
>
>
>ИМХО:
>
>при инициализации БД также где-то учитывается локаль консоли, в которой производится инициализация
>(у меня лично были эти грабли при запуске полнотекстового поиска). //
>возможно это не влияет на ввод-вывод данных из БД, в моем
>случае это проявлялось только при развертывании поиска и на линухе.

проверил старый сервер на локаль:
не настроена:
$ locale
LANG=
LC_CTYPE="C"
LC_COLLATE="C"
LC_TIME="C"
LC_NUMERIC="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=

новый сервер, аналогично:
$ locale
LANG=
LC_CTYPE="C"
LC_COLLATE="C"
LC_TIME="C"
LC_NUMERIC="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=

но на старом я как то так собрал постгрес года полтора назад так что postgres KOI8 стал, а тут не получается...

самое смешное что старый инсталл тоже я делал, а повторить не могу %)))

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от PavelR (??) on 10-Июл-09, 19:10 
>[оверквотинг удален]
>LC_NUMERIC="C"
>LC_MONETARY="C"
>LC_MESSAGES="C"
>LC_ALL=
>
>но на старом я как то так собрал постгрес года полтора назад
>так что postgres KOI8 стал, а тут не получается...
>
>самое смешное что старый инсталл тоже я делал, а повторить не могу
>%)))

посмотреть /var/db/ports/ ?

сравнить опции компиляции, которые выдает pg_config? ?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от _RAW_ email(ok) on 11-Июл-09, 01:03 
>[оверквотинг удален]
>>
>>но на старом я как то так собрал постгрес года полтора назад
>>так что postgres KOI8 стал, а тут не получается...
>>
>>самое смешное что старый инсталл тоже я делал, а повторить не могу
>>%)))
>
>посмотреть /var/db/ports/ ?
>
>сравнить опции компиляции, которые выдает pg_config? ?

абсолютно идентичны. ну за исключением сборки freebsd 6.2 - 7.2 и постгреса 8.2.3 - 8.3.7


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от BlackHawk (ok) on 10-Июл-09, 21:31 
>[оверквотинг удален]
>--enable-recode
>
>при инициализации системных таблиц проделал:
>/usr/local/etc/rc.d/postgresql initdb --encoding=KOI8 --locale=ru_RU.KOI8-R
>
>все без толку, postgres по прежнему в кодировке UTF8, а данные отдаются
>кракозябрами...
>как заставить собраться постгрес так, чтобы он весь насквозь был в KOI8?
>
>что я не учел?

не учел юзверя pgsql, у которого по умолчанию стоит локаль en_US.UTF-8 (как советуется при установки самого postresql)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от _RAW_ email(ok) on 11-Июл-09, 01:22 
>не учел юзверя pgsql, у которого по умолчанию стоит локаль en_US.UTF-8 (как
>советуется при установки самого postresql)

Принудительно поменял локаль:
/etc/csg.login
setenv LANG ru_RU.KOI8-R
setenv MM_CHARSET KOI8-R
setenv LC_ALL ru_RU.KOI8-R

/etc/csh.login
setenv LANG ru_RU.KOI8-R
setenv MM_CHARSET KOI8-R
setenv LC_ALL ru_RU.KOI8-R

и даже /etc/master.passwords
pgsql:*:70:70:russian:0:0:PostgreSQL User:/usr/local/pgsql:/bin/sh

теперь locale под рутом показывает:
# locale
LANG=ru_RU.KOI8-R
LC_CTYPE="ru_RU.KOI8-R"
LC_COLLATE="ru_RU.KOI8-R"
LC_TIME="ru_RU.KOI8-R"
LC_NUMERIC="ru_RU.KOI8-R"
LC_MONETARY="ru_RU.KOI8-R"
LC_MESSAGES="ru_RU.KOI8-R"
LC_ALL=ru_RU.KOI8-R

после этого пересобрал постгрес и попробовал запустить инициализацию системных бд. в итоге вот что вышло:

ns# /usr/local/etc/rc.d/postgresql initdb --encoding=KOI8 --locale=ru_RU.KOI8-R
Файлы, сопутствующие этой системе баз данных, будут
принадлежать пользователю "pgsql". Этот пользователь
также должен быть владельцем процесса сервера.
Кластер баз данных будет инициализирован со следующими локалями:
  COLLATE:  C
  CTYPE:    ru_RU.KOI8-R
  MESSAGES: ru_RU.KOI8-R
  MONETARY: ru_RU.KOI8-R
  NUMERIC:  ru_RU.KOI8-R
  TIME:     ru_RU.KOI8-R
initdb: encoding mismatch
The encoding you selected (UTF8) and the encoding that the
selected locale uses (KOI8) do not match.  This would lead to
misbehavior in various character string processing functions.
Rerun initdb and either do not specify an encoding explicitly,
or choose a matching combination.

где я выбрал encoding UTF8 я не вижу... --encoding=KOI8 - некорректно?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от _RAW_ email(ok) on 11-Июл-09, 13:39 
>что я не учел?

разобрался.
инициализацию таблиц сделал через
#su -l pgsql -c "initdb -E KOI8 -D /usr/local/pgsql/data"

сработало - postgres таблица в KOI8

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от nadirx2 (ok) on 12-Июл-09, 08:09 

>#su -l pgsql -c "initdb -E KOI8 -D /usr/local/pgsql/data"

так и должно быть.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от _RAW_ email(ok) on 12-Июл-09, 18:51 
>
>>#su -l pgsql -c "initdb -E KOI8 -D /usr/local/pgsql/data"
>
>так и должно быть.

правда проблему это не решило... таблица кои8, сервер кои8, клиент и сервер энкодинг кои8... данные лежат в win1251, страничка на апаче на которую падают данные тоже в win1251... но при выборке все равно кракозябры на манер таких:

Опорный вместо нормальных русских букв...

как это победить? дело в том, что на старом то серваке все корректно по такой схеме выбирается. а тут не знаю даже что и думать... как исправить...

не подскажете?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от bill (ok) on 12-Июл-09, 19:32 
>>
>>>#su -l pgsql -c "initdb -E KOI8 -D /usr/local/pgsql/data"
>>
>>так и должно быть.
>
>правда проблему это не решило... таблица кои8, сервер кои8, клиент и сервер
>энкодинг кои8... данные лежат в win1251, страничка на апаче на которую
>падают данные тоже в win1251... но при выборке все равно кракозябры
>на манер таких:

Поясните, что значит "данные лежат в win1251".

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от _RAW_ email(ok) on 12-Июл-09, 20:11 
>[оверквотинг удален]
>>>>#su -l pgsql -c "initdb -E KOI8 -D /usr/local/pgsql/data"
>>>
>>>так и должно быть.
>>
>>правда проблему это не решило... таблица кои8, сервер кои8, клиент и сервер
>>энкодинг кои8... данные лежат в win1251, страничка на апаче на которую
>>падают данные тоже в win1251... но при выборке все равно кракозябры
>>на манер таких:
>
>Поясните, что значит "данные лежат в win1251".

ну если скажем дамп базы посмотреть через эдитор, то чарсет у базы выставлен в кои8, а осмысленность содержимое приобретает, если смотреть его в кодировке win1251.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

13. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от angra (ok) on 12-Июл-09, 21:53 
И это тебя вообще ни на какие мысли не наводит? Ну типа того, что такое несоответствие допускать нельзя, что сервер не сможет корректно преобразовывать данные, что можно в конечном итоге вообще получить смешанную кодировку в записях базы и уйму проблем в будущем.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

15. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от _RAW_ email(ok) on 13-Июл-09, 06:33 
>И это тебя вообще ни на какие мысли не наводит? Ну типа
>того, что такое несоответствие допускать нельзя, что сервер не сможет корректно
>преобразовывать данные, что можно в конечном итоге вообще получить смешанную кодировку
>в записях базы и уйму проблем в будущем.

ну вообще наводит. наводит на мысль о том, что надо установить весь сервер по новой в win1251 encoding

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

17. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от angra (ok) on 13-Июл-09, 07:10 
Как то не верится, чтобы такой из себя продвинутый постгрес уступал по возможностям работы с кодировками мускулу. В мускуле же можно вытворить с ними все что угодно и ничего пересобирать не нужно. Посмотрите еще раз доку.
Еще, проверять желательно в постгревом клиенте, а не на веб страничках, так как последние вводят еще минимум три фактора, способных все испортить. Изоляция проблемы прежде всего.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

19. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от _RAW_ email(ok) on 13-Июл-09, 10:18 
>Как то не верится, чтобы такой из себя продвинутый постгрес уступал по
>возможностям работы с кодировками мускулу. В мускуле же можно вытворить с
>ними все что угодно и ничего пересобирать не нужно. Посмотрите еще
>раз доку.
>Еще, проверять желательно в постгревом клиенте, а не на веб страничках, так
>как последние вводят еще минимум три фактора, способных все испортить. Изоляция
>проблемы прежде всего.

в доках написано что мол client_encoding должен все исправить... что если данные допустим в win1251 то прекрасно через энкодинг можно работать с кои8 и утф8 например.

но только вот меня что смущает... на старом серваке же те же самые данные, в тех же самы хтаблицах и их обрабатывают те же самые скрипты. данные там 1251, кодировка баз кои8 клиент и сервер энкодинг тоже кои8. и все прекрасно отображается.
что ж в новом не то... и базы той же кодировки и энкодинга, и данные те же самые, и скрипты те же. клон полный - ан нет, отображает кракозябры.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

12. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от _RAW_ email(ok) on 12-Июл-09, 20:48 
>[оверквотинг удален]
>>>>#su -l pgsql -c "initdb -E KOI8 -D /usr/local/pgsql/data"
>>>
>>>так и должно быть.
>>
>>правда проблему это не решило... таблица кои8, сервер кои8, клиент и сервер
>>энкодинг кои8... данные лежат в win1251, страничка на апаче на которую
>>падают данные тоже в win1251... но при выборке все равно кракозябры
>>на манер таких:
>
>Поясните, что значит "данные лежат в win1251".

вот думаю, если в дампе client_encoding поправить на WIN1251 это сработает?
или как правильно эту кодировку обозначить?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

14. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от bill (ok) on 12-Июл-09, 21:58 
>[оверквотинг удален]
>>>
>>>правда проблему это не решило... таблица кои8, сервер кои8, клиент и сервер
>>>энкодинг кои8... данные лежат в win1251, страничка на апаче на которую
>>>падают данные тоже в win1251... но при выборке все равно кракозябры
>>>на манер таких:
>>
>>Поясните, что значит "данные лежат в win1251".
>
>вот думаю, если в дампе client_encoding поправить на WIN1251 это сработает?
>или как правильно эту кодировку обозначить?

Значит дамп залит неправильно. Если дамп сохранён в 1251 , то имхо при залитии надо client_encoding выставлять в 1251.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

16. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от _RAW_ email(ok) on 13-Июл-09, 06:35 
>[оверквотинг удален]
>>>>падают данные тоже в win1251... но при выборке все равно кракозябры
>>>>на манер таких:
>>>
>>>Поясните, что значит "данные лежат в win1251".
>>
>>вот думаю, если в дампе client_encoding поправить на WIN1251 это сработает?
>>или как правильно эту кодировку обозначить?
>
>Значит дамп залит неправильно. Если дамп сохранён в 1251 , то имхо
>при залитии надо client_encoding выставлять в 1251.

попробовал поправить client_encoding в дампе на win1251 - не помогло. база тоже должна быть создана с win1251 кодировкой, а создать ее не нает сервер так как сам в кои8... придется пересобрать сервер в win1251.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

18. "PostgreSQL отдает данные в UTF вместо KOI8"  +/
Сообщение от _RAW_ email(ok) on 13-Июл-09, 07:35 
>[оверквотинг удален]
>>>>падают данные тоже в win1251... но при выборке все равно кракозябры
>>>>на манер таких:
>>>
>>>Поясните, что значит "данные лежат в win1251".
>>
>>вот думаю, если в дампе client_encoding поправить на WIN1251 это сработает?
>>или как правильно эту кодировку обозначить?
>
>Значит дамп залит неправильно. Если дамп сохранён в 1251 , то имхо
>при залитии надо client_encoding выставлять в 1251.

попробовал испольнить
set client_encoding to 'WINDOWS-1251';
пофиг - все равно clientt_encoding KOI8

как сменить то client_encoding на созданой базе? %)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру