PostgreSQL 7.3 + кириллица

binary
Дата: 16.04.2004 13:58:04
Есть проблема. pgsql собран с --enable-multibyte --with-mb=windows-1251
База в локали WIN.

psql -l -U pgsql
List of databases
Name | Owner | Encoding
------------+-------+----------
filesearch | pgsql | WIN
template0 | pgsql | WIN
template1 | pgsql | WIN

Собственно, в базе filesearch есть записи в кириллице. При попытке выбрать, данные отображаются нормально, но при поиске все символы регистрозависимые. Подскажите, пожалуйста, как сделать регистронезависимый поиск в кириллице? Система - FreeBSD 4.9, PostgreSQL 7.3.5
binary
Дата: 16.04.2004 15:09:44
Всё, разобрался, уже не актуально, спасибо :)
Stas Tristan
Дата: 17.04.2004 01:14:41
Подскажи, как разобрался
binary
Дата: 19.04.2004 10:29:12
Просто корректно настроил локаль в системе и сделал pw usermod pgsql -L russian
После этого корректно заработала кириллица :)
Stas Tristan
Дата: 19.04.2004 15:21:33
А можно поподробнее? А тоя только начал осваивать Postgres и то - под Windows через Cygwin. Вот Список прирложений, что у меня лежат в директории Bin (я пользуюсь коммерческой сборкой Command Promt ибо открытую не смог корректно поставить):

basename.exe
bash.exe
bzip2.exe
cat.exe
chmod.exe
chown.exe
cp.exe
cygrunsrv.exe
exece.exe
grep.exe
ipc-daemon.exe
kill.exe
less.exe
ln.exe
ls.exe
mkdir.exe
mkgroup.exe
mkpasswd.exe
mount.exe
pg_dump.exe
pg_dumpall.exe
pg_dumplo.exe
pg_id.exe
pg_restore.exe
pgsqltray.exe
pgsqltray_kill.exe
postgres.exe
ps.exe
psql.exe
rm.exe
sed.exe
sh.exe
stty.exe
tar.exe
umount.exe
vacuumlo.exe

Можешь в этой ситуации что-то подсказать? Какие команды из консоли настраивают локаль?
VovanVS
Дата: 29.04.2004 18:16:20
Столкнулся я тоже с проблемой сортировки русских слов без учета регистра. Pgsql 7.3.4 под Rad Hat Linux 8.0, кодировка UNICODE. Поиск по форуму и последующие попытки настроить локаль к результату не привели. А решать проблему нужно было, и быстро. Пришлось сделать "по-студенчески" - в лоб. Для этого написал 2 user-defined functions:
lowChar(varchar) RETURNS varchar;
и
lowStr(varchar) RETURNS varchar;
Первая представляет собой ветвление вида CASE $1 WHEN 'А' THEN 'а', т.е. вручную перебирает все символы русского языка (впридачу несколько символов из украинского - тоже было нужно). А вторая - последовательно "прогоняет" каждый символ из аргумента через первую функцию. А потом уже делается сортировка: ORDER BY lowStr(label).
Данные сравнения производительности:
162 строки, Windows, PgSQL 7.3.4 на CygWin
используя встроенную функцию lower() - запрос выполняется 10 ms
используя предлагаемую функцию lowStr() - запрос выполняется 70 ms.
Решение, естественно, не так красиво, как если нормально настроить локаль, но если не получается, то можно и так.
Если интересно, могу выложить полный код функций.
OAN
Дата: 29.04.2004 20:18:02
-- "ВЕРХНИЙ" регистр киррилицы
CREATE OR REPLACE FUNCTION w_upper(text) RETURNS text IMMUTABLE AS '
DECLARE BEGIN
RETURN TRANSLATE($1, ''abcdefghijklmnopqrstuvwxyzёабвгдежзийклмнопрстуфхцчшщъыьэюяіїє'',
''ABCDEFGHIJKLMNOPQRSTUVWXYZЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯІЇЄ'');
END; ' LANGUAGE 'plpgsql';

-- "нижний" регистр киррилицы
CREATE OR REPLACE FUNCTION w_lower(text) RETURNS text IMMUTABLE AS '
DECLARE BEGIN
RETURN TRANSLATE($1, ''ABCDEFGHIJKLMNOPQRSTUVWXYZЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯІЇЄ'',
''abcdefghijklmnopqrstuvwxyzёабвгдежзийклмнопрстуфхцчшщъыьэюяіїє'');
END; ' LANGUAGE 'plpgsql';
VovanVS
Дата: 30.04.2004 12:18:41
Согласен, вышеприведенный способ решения задачи гораздо понятнее и проще в реализации.