Еще раз про lower() & upper() с кириллицей

KR

alive in new life
Еще раз про lower() & upper() с кириллицей

Начал с того, что прочитал
http://www.phpclub.ru/talk/showthread.php?s=&threadid=7837&highlight=lower и
http://www.phpclub.ru/talk/showthread.php?s=&threadid=19616&highlight=lower
http://faq.phpclub.net/practice.pgsql.html

но ответа на вопрос к сожалению не нашел (или плохо смотрел)


1) версия постгреса 7.4.3
2) насчет initdb -E KOI8/WIN не знаю и установить сейчас будет достаточно сложно, но
CREATE DATABASE dbname WITH ENCODING = 'WIN';

3) данные в этой самой dbname лежат в CP1251
4) локаль
setenv LANG ru_RU.KOI8-R
setenv MM_CHARSET KOI8-R
5) по-поводу --enable-locale --enable-multibyte. Ставил во FreeBSD из портов. в Makefile порта не нашел похожих ключей.

тем не менее lower и upper работают не так, как ожидается, судя по всему постгри пытается работать с данными считая, что они в KOI8.


Предчувствуя нападки в свою сторону насчет того, что локаль KOI8, поэтому ничего не работает поясняю, что данные в базах могут лежать как в KOI8, так и в WIN
Мне кажется, что постгрес в первую очередь должен ориентироваться на кодировку, указанную для конкретной базы данных и в соотвествии с локалью осуществлять необходимые преобразования, хотя могу и ошибаться.

собственно два вопроса:
1) где я не прав?
2) можно ли вообще хранить данные в разных кодировках, естественно, в разных базах и будет ли постгрес при этом вести себя адекватно?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Re: Еще раз про lower() & upper() с кириллицей

Автор оригинала: KR
Начал с того, что прочитал
http://www.phpclub.ru/talk/showthread.php?s=&threadid=7837&highlight=lower и
http://www.phpclub.ru/talk/showthread.php?s=&threadid=19616&highlight=lower
http://faq.phpclub.net/practice.pgsql.html

но ответа на вопрос к сожалению не нашел (или плохо смотрел)

1) насчет initdb -E KOI8/WIN не знаю и установить сейчас будет достаточно сложно, но
дальше можно не читать. правила сравнения строк и т.п. задаются локалью при initdb. грубо говоря, если postgres при создании кластера баз про русские буквы не знает, то потом ты ему про них не расскажешь.

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

тем более что с интуицией ты уже второй раз пальцем в небо
 

KR

alive in new life
спасибо за помощь.

-~{}~ 22.09.04 14:14:

В этом случае было бы не плохо поправить http://faq.phpclub.net/practice.pgsql.html,
"3. После этого надо проинициализировать директорию, в которой будут находиться базы данных, указав кодировку по умолчанию (можно, впрочем, и не указывать)"

"4. Кодировку также можно указывать при создании отдельных баз"

В моем случае кодировка была указана при создании конкретной базы.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: KR
"3. После этого надо проинициализировать директорию, в которой будут находиться базы данных, указав кодировку по умолчанию (можно, впрочем, и не указывать)"

"4. Кодировку также можно указывать при создании отдельных баз"

В моем случае кодировка была указана при создании конкретной базы.
там перед этим ещё идёт пункт 2 и есть замечание к пункту 3, из которых вполне следует, что для поддержки языка наиболее важна установленная при initdb локаль.

а проверить эту самую локаль можно командой SHOW lc_collate;
 

Julik

Guest
ну хорошо, с простым вроде разобрались

усложним задачу

как добиться работоспособности upper() и lower() (и всей прочей locale-dependent дребедени) в UTF-8 для русского?

кластер инициализировал без локали (то бишь в локали C) - не работала даже сортировка, lower() и upper() выдавали неизмененный текст

кластер инициализировал в локали ru_RU.UTF-8 - сортировка не работает, lower() и upper() русские буквы уничтожают


кластер инициализировал в локали ru_RU.UTF-8 и с дополнительным LC_COLLATE=ru - сортировка работает, lower() и upper() русские буквы уничтожают. Что странно - SHOW lc_collate в клиенте все равно показывает C.

Ось - MacOS X 10.3

Короче говоря - как быть то? Ждать восьмой версии и все? То "юникод у нас прекрасно работает, но мы им ни разу не пользвались"?

Кстати, спросить про это Tatsio Ishii думаю бессмысленно по причине того, что строчных-прописных в японском вроде как нету ВОВСЕ, то есть он вряд ли в курсе, работают они или нет. Он советует всегда делать кластер без локали (могу процитировать его емейл на эту тему).
 

KR

alive in new life
Да не разобрались, как оказалось.

# portupgrade -f -m "--enable-multibyte --enable-locale --enable-syslog" postgresql
#pkg_version -v | grep postgresql
postgresql-7.4.2 = up-to-date with port

# su pgsql
$ echo $LANG
ru_RU.KOI8-R
$ cd ~
$ csh
%initdb -E KOI8
The files belonging to this database system will be owned by user "pgsql".
This user must also own the server process.

The database cluster will be initialized with locale ru_RU.KOI8-R.
....

Success. You can now start the database server using:

/usr/local/bin/postmaster -D /usr/local/pgsql/data
or
/usr/local/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start

%exit
# /usr/local/etc/rc.d/010.pgsql.sh start
# psql -U pgsql -d template1
template1=# CREATE DATABASE moscowout WITH ENCODING 'WIN';
CREATE DATABASE
template1=# CREATE USER moscowout WITH PASSWORD '******';
CREATE USER
template1=# GRANT ALL PRIVILEGES ON DATABASE moscowout TO moscowout;
GRANT
template1=# \q
tchibo# psql -U moscowout -d moscowout
moscowout=> SHOW lc_collate;
lc_collate
--------------
ru_RU.KOI8-R
(1 ??????)

Как следствие локаль работает, но работает она именно как КОИ несмотря на то, как создавалась база данных.

естественно, что на работе ILIKE это не сказывается, а вот upper/lower работают с точностью до наоборот.

пробовал и так и эдак. ничего не помогает.

P.S.
FreeBSD 4.10 STABLE
тоже самое наблюдалось и в постгресе 7.4.5 который был заменен обратно на 7.4.2 в процессе бесконечных экспериментов.

-~{}~ 18.10.04 18:30:

Удачным решением оказалось хранение данных БДв КОИ, а в скрипте соединения с БД указывать SET client_encoding = 'WIN';
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Гы, проверил у себя (кластер инициализирован с cp1251, базу создал в koi-8) --- те же яйцы, работает как с cp1251 несмотря на кодировку.

Видимо правильным решением будет действительно не создавать базы в разной кодировке, а юзать исключительно set client_encoding.

По поводу UTF-8 --- ждать восьмой версии. Там upper() / lower() поправили.
 
Сверху