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); //Windows DataSet.Fields.FieldByName('NAME').asString: Изменение БД DataSet.Fields.FieldByName('NAME').AsBytes: C8 E7 EC E5 ED E5 ED E8 E5 20 C1 C4 //Linux 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); //Windows 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 //Linux 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