Quantcast
Channel: Embarcadero Community - Embarcadero Community
Viewing all articles
Browse latest Browse all 2504

FireDAC/linux win1251 strings

$
0
0

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 


Viewing all articles
Browse latest Browse all 2504


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>