Lazarus PostgreSQL i problem z polskimi znakami

0

Witam.

Już od kilku miesięcy bawię się w testowanie lazarusa w ujęciu client serwer.
Bywało z tym różnie ale ciągle do przodu. Nawet udało mi się już napisać programik, z tym że wyszedł problem związany z polskimi znakami, a dokładnie rzecz ujmując z przesłaniem ciągu znakowego z tabeli która zwiera pole określonej max długości.

Np mając pole "test" character varying(9) posiadające wartość: 1234567ĄĄ(w badzie danych ładnie go widać że ma 9 znaków).

Teraz pobierając dane z tego pola przez program napisany w lazarusie otrzymuję wartość: 1234567Ą(czyli błędnie bo w bazie jest 1234567ĄĄ, brakuje jednego znaku.

Parametry bazy danych PostgreSQL9 zainstalowanej na Win XP
ENCODING = 'UTF8'
TABLESPACE = pg_default
LC_COLLATE = 'Polish_Poland.1250'
LC_CTYPE = 'Polish_Poland.1250'
CONNECTION LIMIT = -1;

Teraz pytanie gdzie leży problem że dokonuje się jakaś nie jawna konwersja polskich znaków że z bazy danych otrzymują mniej znaków. Co ciekawe zauważyłem iż jeżeli użyję określoną ilość polskich znaków w takim polu to otrzymuję po wykonaniu zapytanie przez program o tyle samo mnie znaków.
Wygląda to jakby zachodziła nie jawna konwersja między UTF8 Win1250 na jakimś etapie, bo polskie znaczki w UTF8 zajmują 2 bajty.

Co ciekawe jeżeli z tego programu robię operację wstawienia lub modyfikacji tego pola z maksymalną ilością znaków np 1234567ĄĄ to w polu w bazie danych zapisywana jest dokładnie ta wartość.
Natomiast jeżeli pobieram dane dane z tego pola to mam wartość 1234567Ą

I teraz jest pytanie czy jak robię coś nie tak, tylko pytanie w którym miejscu.

PS.
Myślałem ze problem może leżeć po stronie biblioteki libpq dla danego systemu, dlatego kompilację programu zrobiłem też na linuksie Ubuntu, ale efekt ten sam.

Pozdrawiam.
Tadeusz

0

może byś np. kod pokazał jak pobierasz i wyświetlasz te dane w programie

0

Zawrtość pola test w tabeli

test

ĄĄĄ
123456789
AAAAAAAAA
AAA123456
1234567Ąą
ĄĄĄ123456

Inicjacja połączenia
procedure TForm1.btnConnectClick(Sender: TObject);
var
S: String;
begin
try
PQConnection1.Connected:= True;
SQLQuery1.Open;

     SQLQuery1.Last;
     S := IntToStr(SQLQuery1.RecordCount) + #13#10;
     SQLQuery1.First;

     while not SQLQuery1.EOF do
         begin
 

         Memo1.Lines.Add(SQLQuery1.FieldByName('test').AsString);
         SQLQuery1.Next;
         end;

 except
       on E: Exception do
       ShowMessage(E.message);
 end;

end;

Zawartość pola Memo1 w aplikacji
ĄĄĄ
123456789
AAAAAAAAA
AAA123456
1234567Ą?
ĄĄĄ1234

0

I teraz jest pytanie czy jak robię coś nie tak, tylko pytanie w którym miejscu.

I teraz jest pytanie, czy umiesz pisać po polsku...

Zazwyczaj pytają bo nie działa. Ten pyta bo działa... I sam sobie odpowiada na pytanie jak to rozwiązać. Zakładam więc że jesteś bardzo ciekawy co jest nie tak, wobec tego:
1.Sprawdź czy inne programy (np. Delphi) mają to samo
2.Sprawdź czy w kodzie Lazarusa jest może ręczne sprawdzanie długości stringa.
3.Sprawdź czy takie coś jest zgłoszone
4.Na tej podstawie zgłoś odpowiedni bug najlepiej z patchem do Lazarusa. Jeżeli na Delphi działa to możesz zgłaszczać jako błąd zgodności z Delphi.

Na moją pomoc nie licz. Mam ciekawsze rzeczy do roboty niż filozofowanie czemu coś teoretycznie nie działa bo mi się tak wydaje.

0

@tadek_t sprawdź obsługę strony kodowej w PostgreSQL oraz w systemie...
Pewnie jest tak, że memo używa innego zestawu czcionek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1