Lazarus PostgreSQL i problem z polskimi znakami

Lazarus PostgreSQL i problem z polskimi znakami
TT
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:2
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

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
0

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


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
TT
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 12 lat
  • Postów:2
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

edytowany 3x, ostatnio: tadek_t
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.

NE
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 11 lat
  • Postów:29
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.