I'm developing a cross-platform console application for working with the database using FireDAC. Database - Firebird with win1251 encoding:
fConnection := TFDConnection.Create(nil);
fConnection.DriverName := S_FD_FBId;
fConnection.Params.AddPair(PARAM_PATH, Path);
fConnection.Params.AddPair(PARAM_USERNAME, Username);
fConnection.Params.AddPair(PARAM_PASSWORD, Password);
fConnection.Params.AddPair(PARAM_HOST, Port.ToString);
fConnection.Params.AddPair(PARAM_PORT, '');
fConnection.Params.AddPair(PARAM_AUTH, 'No');
fConnection.Params.AddPair(PARAM_CHARSET, 'WIN1251');
fConnection.Params.AddPair(PARAM_METADATA, 'False');
fConnection.Params.AddPair(PARAM_PROTOCOL, 'Local');
fConnection.Params.AddPair(PARAM_SQLDIALECT, '3');
fConnection.Params.AddPair(PARAM_ROLE, 'Admin');
fConnection.Params.AddPair(PARAM_MODE, 'Open');
fConnection.Params.AddPair(PARAM_DROPDATABASE, 'No');
fConnection.Params.AddPair(PARAM_PAGESIZE, '4096');
fConnection.Params.AddPair(PARAM_ADVANCED, '');
Executing queries in Windows returns the correct strings, but the same query in Linux returns string fields, like the character set "?" (#3F) and spaces (#20):
//
var
DataSet: TDataSet;
fConnection.ExecSQL(QueryText, DataSet);
DataSet.Fields.FieldByName('NAME').asString: Изменение БД
DataSet.Fields.FieldByName('NAME').AsBytes: C8 E7 EC E5 ED E5 ED E8 E5 20 C1 C4
DataSet.Fields.FieldByName('NAME').asString: ????????? ??
DataSet.Fields.FieldByName('NAME').AsBytes: 3F 3F 3F 3F 3F 3F 3F 3F 3f 20 20 3F 3F
For example, if change the encoding in the connection parameters to UTF8:
//
fConnection.Params.AddPair(PARAM_CHARSET, 'UTF8');
var
DataSet: TDataSet;
fConnection.ExecSQL(QueryText, DataSet);
DataSet.Fields.FieldByName('NAME').asString: Изменение БД
DataSet.Fields.FieldByName('NAME').AsBytes: 18 04 37 04 3C 04 35 04 3D 04 35 04 3D 04 38 04 35 04 20 00 11 04 14 04
DataSet.Fields.FieldByName('NAME').asString: Изменение БД
DataSet.Fields.FieldByName('NAME').AsBytes: 18 04 37 04 3C 04 35 04 3D 04 35 04 3D 04 38 04 35 04 20 00 11 04 14 04
How to properly use FireDAC for Linux with Win1251 encoding?
P.S. Embarcadero Delphi 10.2 Version 25.0.27659.1188