Autor Téma: SQLite + FireDAC vkladanie textu UTF8 bez konverzie ?  (Přečteno 4176 krát)

Offline miroB

  • Guru
  • *****
  • Příspěvků: 628
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005 .. D Tokyo 10.2.3 Pro C/S
Je to možné priamo v Delphi?
Takto nejako by to malo fungovat?
Kód: Delphi [Vybrat]
  1. TField.AsString := moj_AnsiString
resp. UTF8String?

100459

  • Host
Re:SQLite + FireDAC vkladanie textu UTF8 bez konverzie ?
« Odpověď #1 kdy: 03-07-2018, 12:20:32 »
Konverze probehne implicitne. Jde o naprosto stejnou implicitni konverzi jako napr. v tomto kodu:

Kód: Delphi [Vybrat]
  1. var
  2.   S: string; // UnicodeString
  3.   U: UTF8String;
  4. begin
  5.   U := 'Some text';
  6.   S := U; // implicitni konverze
  7. end;
« Poslední změna: 03-07-2018, 12:42:54 od 100459 »

Offline miroB

  • Guru
  • *****
  • Příspěvků: 628
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005 .. D Tokyo 10.2.3 Pro C/S
Re:SQLite + FireDAC vkladanie textu UTF8 bez konverzie ?
« Odpověď #2 kdy: 03-07-2018, 12:44:19 »
Ked teda uz mam zdroj priamo v UTF8, tak mozem pouzit :
Kód: Delphi [Vybrat]
  1. Field.AsString := moj_utf8_text;
Nejak som sa obaval  toho, ze  Field.AsString a Field.AsWideString su uz od D2009+ automaticky konvertovane na WideString
Asi som zatazeny Accessom. Tan robi texty vo WideString a engina neposkytuje inu moznost. Na rozdiel od SQLite

100461

  • Host
Re:SQLite + FireDAC vkladanie textu UTF8 bez konverzie ?
« Odpověď #3 kdy: 03-07-2018, 12:50:22 »
Ano. Tady ovsem zalezi taky na typu pole:

- TStringField (ANSI typ pole) - accessor AsString interne ulozi predany UnicodeString po pretypovani jako AnsiString
- TWideStringField (Unicode typ pole) - accessor AsString interne ulozi Unicode retezec tak jak byl predan

Ta implicitni konverze z UTF8String na UnicodeString pri predavani hodnoty accessoru AsString probehne v obou pripadech. Tedy:

Kód: Delphi [Vybrat]
  1. var
  2.   U: UTF8String;
  3. begin
  4.   TStringField(MyAnsiField).AsString := U; // implicitni konverze UTF8String na UnicodeString, pote ulozeni AnsiString
  5.   TWideStringField(MyUnicodeField).AsString := U; // implicitni konverze UTF8String na UnicodeString, pote ulozeni UnicodeString
  6. end;
« Poslední změna: 03-07-2018, 13:04:35 od 100461 »

Offline miroB

  • Guru
  • *****
  • Příspěvků: 628
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005 .. D Tokyo 10.2.3 Pro C/S
Re:SQLite + FireDAC vkladanie textu UTF8 bez konverzie ?
« Odpověď #4 kdy: 03-07-2018, 13:26:26 »
Vezmime predpoklady:
1. SQLite engina ma nastaveny sposob ukladania textu ako UTF8
2. V Delphi pracujem priamo s UTF8 / AnsiStringami / PAnsiChar

Vysledok:
NIE JE znama cesta, ako dostat UTF8 text bez konverzie do SQLite ?

Je ta konverzia dost rychla / zanedbatelna, ak hovorime radovo o 100-kach MB dat?
« Poslední změna: 03-07-2018, 13:29:53 od Miroslav Baláž »

100464

  • Host
Re:SQLite + FireDAC vkladanie textu UTF8 bez konverzie ?
« Odpověď #5 kdy: 03-07-2018, 14:36:59 »
Vezmime predpoklady:
1. SQLite engina ma nastaveny sposob ukladania textu ako UTF8
2. V Delphi pracujem priamo s UTF8 / AnsiStringami / PAnsiChar

Vysledok:
NIE JE znama cesta, ako dostat UTF8 text bez konverzie do SQLite ?

Je ta konverzia dost rychla / zanedbatelna, ak hovorime radovo o 100-kach MB dat?

Cesta bez konverze existuje. Mohl bys zavolat funkci sqlite3_bind_text64 a specifikovat enkodovani SQLITE_UTF8. FireDAC ji nepouziva, ten posila data vzdy ve forme Unicode pres sqlite3_bind_text (viz. metoda TSQLiteBind.InternalSetData).

Zda je konverze rychla. Bez mereni a porovnani tezko rict. Nicmene pri pouziti AsString accessoru (u parametru nebo pole typu ftWideString), dojde jen k te implicitni konverzi (z UTF8String nebo AnsiString na UnicodeString).
« Poslední změna: 03-07-2018, 15:03:12 od 100464 »

Offline miroB

  • Guru
  • *****
  • Příspěvků: 628
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005 .. D Tokyo 10.2.3 Pro C/S
Re:SQLite + FireDAC vkladanie textu UTF8 bez konverzie ?
« Odpověď #6 kdy: 03-07-2018, 15:59:29 »
Ďakujem. Toto som určite nevedel. Uvidím, ako to pôjde v praxi. Ak by to bolo moc pomalé, spravil by som test. Zavesím ho sem, až keď by k testu došlo.
Vidím, že sqlite3_bind_text64 je odkazovaný vo FireDAC.Phys.SQLiteCli.pas

100466

  • Host
Re:SQLite + FireDAC vkladanie textu UTF8 bez konverzie ?
« Odpověď #7 kdy: 03-07-2018, 16:37:53 »
Vidím, že sqlite3_bind_text64 je odkazovaný vo FireDAC.Phys.SQLiteCli.pas

Tam jsou prototypy funkci. V poli Fsqlite3_bind_text64 objektu TSQLiteLib by mela byt nactena i adresa (pokud je verze SQLite alespon 3.8.7, kdy byla do SQLite pridana). Ber v potaz fakt ze pokud ji budes volat z metody TSQLiteBind.InternalSetData, data predane parametru nebo poli budou diky te implicitni konverzi v tomto miste UnicodeString.