Discussion:
[pgsql] lower/upper - polskie znaki po raz kolejny
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Filip Sielimowicz
2003-09-09 10:39:57 UTC
Permalink
Coś mi nie działa prawidłowo funkcja like i ~ kiedy pojawiają się polskie znaki, więc
po dużych bojach doszedłem do czegoś takiego:

select
convert(lower(convert('czuŁkĄwężka', 'UNICODE', 'LATIN2')), 'LATIN2', 'UNICODE'),
lower('czuŁkĄwężka')

No i oczywiście w tym zapytaniu jest ok - jak wpierw konwertuję na
LATIN2, używam funkcji a potem konwersja z powrotem do UNICODE
to wyniki są poprawne. bez konwersji - nic z tego.
Oczywiście bazę mam UNICODE.

I teraz pytanie: czy mając bazę w UNICODE mogę jakoś uniknąć
tych strasznych konwersji, czy muszę bazę postawić na LATIN2 ?

Wszystkie zmienne typu LC_ mam poustawiane na pl_PL w .bash_profile
a baza po initdb też zdaje się miała to samo (jak to w ogóle teraz sprawdzić ?).

No i jestem w kropce, bo głupi LIKE mi z polskimi literami nie działa,
jeśli wpierw konwertuję na małe.
Albo może inaczej: może jest sposób na to, by LIKE lub ~ ignorowały
wielkość liter, bez konieczności używania konwersji w locie (ani tworzenia
indeksów funkcyjnych lub dodatkowych kolumn) ?

Filip Sielimowicz
http://panda.bg.univ.gda.pl/~sielim/genetic/gen_tos.htm
A.L.E.C
2003-09-09 19:17:44 UTC
Permalink
Post by Filip Sielimowicz
Wszystkie zmienne typu LC_ mam poustawiane na pl_PL w .bash_profile
a baza po initdb też zdaje się miała to samo (jak to w ogóle teraz sprawdzić ?).
SQL'em tak:
select pg_encoding_to_char(encoding) from pg_database where
datname='nazwa_bazy'
standardowo baza jest tworzona z kodowanie SQL_ASCII
Post by Filip Sielimowicz
No i jestem w kropce, bo głupi LIKE mi z polskimi literami nie działa,
jeśli wpierw konwertuję na małe.
Albo może inaczej: może jest sposób na to, by LIKE lub ~ ignorowały
wielkość liter, bez konieczności używania konwersji w locie (ani tworzenia
indeksów funkcyjnych lub dodatkowych kolumn) ?
ILIKE ?


--
Pozdrawiam
Aleksander Machniak ( A.L.E.C )
http://k27.prv.pl/alec GG-2275252
Robert Grabowski
2003-09-10 08:13:37 UTC
Permalink
Post by Filip Sielimowicz
Coś mi nie działa prawidłowo funkcja like i ~ kiedy pojawiają się polskie znaki, więc
select
convert(lower(convert('czuŁkĄwężka', 'UNICODE', 'LATIN2')), 'LATIN2', 'UNICODE'),
lower('czuŁkĄwężka')
No i oczywiście w tym zapytaniu jest ok - jak wpierw konwertuję na
LATIN2, używam funkcji a potem konwersja z powrotem do UNICODE
to wyniki są poprawne. bez konwersji - nic z tego.
Oczywiście bazę mam UNICODE.
I teraz pytanie: czy mając bazę w UNICODE mogę jakoś uniknąć
tych strasznych konwersji, czy muszę bazę postawić na LATIN2 ?
Wszystkie zmienne typu LC_ mam poustawiane na pl_PL w .bash_profile
a baza po initdb też zdaje się miała to samo (jak to w ogóle teraz sprawdzić ?).
No i jestem w kropce, bo głupi LIKE mi z polskimi literami nie działa,
jeśli wpierw konwertuję na małe.
Albo może inaczej: może jest sposób na to, by LIKE lub ~ ignorowały
wielkość liter, bez konieczności używania konwersji w locie (ani tworzenia
indeksów funkcyjnych lub dodatkowych kolumn) ?
Filip Sielimowicz
http://panda.bg.univ.gda.pl/~sielim/genetic/gen_tos.htm
Napisz sobie funkcję w pl/sql, pl/pgsql lub pl/perl: lower_pl i upper_pl
je wykorzystuj ... Ja zrobiłem sobie funkcje, która polskie krzaczki
zamienia mi na wersje bez ogonków i tak porownuje za pomoca like ... of
coz ndeks trzeba funkcyjny zakladac ;)

pozdrawiam
Robert Grabowski
Filip Sielimowicz
2003-09-10 08:30:11 UTC
Permalink
Post by Robert Grabowski
Napisz sobie funkcję w pl/sql, pl/pgsql lub pl/perl: lower_pl i upper_pl
je wykorzystuj ... Ja zrobiłem sobie funkcje, która polskie krzaczki
zamienia mi na wersje bez ogonków i tak porownuje za pomoca like ... of
coz ndeks trzeba funkcyjny zakladac ;)
Zrobiłem sobie funkcję tolower_unicode (korzystającą z tych convertów)
i na razie o problemie zapomniałem. Założyłem też indeks funkcyjny
na pole nazwisko, ale widzę, że like i tak z niego nie korzysta.
Czort z nim ...
Gdzieś czytałem, że jak są locale pozmieniane na polskie to
LIKE itp nie wykorzystują indeksów.
Robert Grabowski
2003-09-10 15:17:30 UTC
Permalink
Post by Filip Sielimowicz
Post by Robert Grabowski
Napisz sobie funkcję w pl/sql, pl/pgsql lub pl/perl: lower_pl i upper_pl
je wykorzystuj ... Ja zrobiłem sobie funkcje, która polskie krzaczki
zamienia mi na wersje bez ogonków i tak porownuje za pomoca like ... of
coz ndeks trzeba funkcyjny zakladac ;)
Zrobiłem sobie funkcję tolower_unicode (korzystającą z tych convertów)
i na razie o problemie zapomniałem. Założyłem też indeks funkcyjny
na pole nazwisko, ale widzę, że like i tak z niego nie korzysta.
Czort z nim ...
Gdzieś czytałem, że jak są locale pozmieniane na polskie to
LIKE itp nie wykorzystują indeksów.
To prawda, dlatego ja nigdy nie korzystam z locale ... sortowanie po
polskiemu załatwiam poprzez podmianę funkcji porównujących stringi ...

pozdrawiam
Robert Grabowski
Filip Sielimowicz
2003-09-11 06:40:45 UTC
Permalink
Post by Robert Grabowski
Post by Filip Sielimowicz
Gdzieś czytałem, że jak są locale pozmieniane na polskie to
LIKE itp nie wykorzystują indeksów.
To prawda, dlatego ja nigdy nie korzystam z locale ... sortowanie po
polskiemu załatwiam poprzez podmianę funkcji porównujących stringi ...
Tzn ? Podmieniasz jakąś standardową funkcję w c wpiętą w Postgresql'a
(grzebanina w źródłach), czy po prostu piszesz własną funkcję wbudowaną,
potem zakładasz indeks funkcyjny, a na koniec jak sortujesz, to w order by
wrzucasz funkcję ?

A może jeszcze inaczej ?

Filip Sielimowicz
http://panda.bg.univ.gda.pl/~sielim/gen_algol.htm

pbs
2003-09-10 18:49:57 UTC
Permalink
Dnia Wed, 10 Sep 2003 10:30:11 +0200
"Filip Sielimowicz" <***@wp.pl> napisało:

(..)
Post by Filip Sielimowicz
Gdzieś czytałem, że jak są locale pozmieniane na polskie to
LIKE itp nie wykorzystują indeksów.
No - a ja potestowałem to sobie i czasem korzysta, a czasem nie - ale
dlaczego to nie wiem.
Coś w sprawie korzystania z lokali innych niż 'c' poprawiono w 7.4beta,
przynajmniej tak wynika z HISTORY.
--
slackware powered #165326 linux user
http://pbs.linux.net.pl - różne rzeczy dla linuksa
***@linux.net.pl - napisz do mnie
Loading...