1.0.3 автоматически не перекодирует данные при запросе, в отличие от более новых версий. В этом у Вас и проблема. Так что советую сменить движок.

Модератор: Модераторы
select
ID_PARTNER,
WINTOUTF( NAME ) as Name
FROM PARTNER
bloodlines писал(а):У меня как раз возникла такая же проблема при переносе старой программы с Delphi 5 на Lazarus. Проблему я решил так:
Написал для Firebird собственную UDF позволяющую выполнять перекодировку текстовых данных прямо в запросе.
...
Все гениальное просто. Хорошо, что не прочитал это сообщение пару месяцев назад - так и сидел бы на win1251...
bloodlines писал(а):Извините, но я не говорю, что WIN1251 это гуд, я всеми конечностями за Unicode и UTF8. Просто суть в моего вопроса (и как я понял вопроса автора темы) в том, что необходимо именно найти способ конвертации данных в UTF8 не меняя самой базы. В моём случае БД использовали кроме моей и сторонние проги, для которых WIN1251 - родная, потому UDF и писал. Никого сидеть на WIN1251 я не призываю.
В данный момент ушел от win1251 окончательно и возвращаться не собираюсь.
uses ...,LCLProc,...;
....
I:=UTF8Copy(str,1,1);
....
62mkv писал(а):теперь исключение происходит (см. вложение)
...навесить на таблицу VIEW, в котором вызывать эти UDF абсолютно прозрачно для приложения.62mkv писал(а):PS: UDF заценил, но "в КАЖДОМ ЗАПРОСЕ" ;)) че то лениво. проще один раз
procedure TForm1.FormShow(Sender: TObject);
begin
IBConnection1.Charset:='win1251';
SQLQuery1.Open;
end;
procedure TForm1.AllText(Sender: TField; var AText: string; DisplayText: Boolean);
begin
if Sender.DataType=ftString then AText:=CP1251ToUTF8(Sender.AsString)
else
AText:=Sender.AsString;
end;
procedure TForm1.DataSet1AfterOpen(DataSet: TDataSet);
var i:integer;
begin
With DataSet do
begin
for i := 0 to Pred(FieldCount) do
begin
Fields[i].OnGetText:=AllText;
end;
end;
end;
procedure TForm1.FldGetText(Sender: TField; var AText: string; DisplayText: Boolean);
begin
AText:=CP1251ToUTF8(Sender.AsString);
end;
procedure TForm1.FldSetText(Sender: TField; const AText: string);
begin
Sender.AsString:=UTF8ToCP1251(AText);
end;
procedure TForm1.DataSet1AfterOpen(DataSet: TDataSet);
var i:integer;
begin
With DataSet do
begin
for i := 0 to Pred(FieldCount) do
if Fields[i].DataType in [ftString, ftMemo] then
begin
Fields[i].OnGetText:=@FldGetText;
Fields[i].OnSetText:=@FldSetText;
end;
end;
end;
Сейчас этот форум просматривают: Google [Bot] и гости: 230