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

Online Miroslav Baláž

  • Hrdina
  • ****
  • Příspěvků: 271
  • Karma: 10
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Je to možné priamo v Delphi?
Takto nejako by to malo fungovat?
Kód: Delphi [Vybrat]
  1. TField.AsString := moj_AnsiString
resp. UTF8String?

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 950
  • Karma: 43
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
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 Delfin »
I'm a soldier, so don't panic! I know the underground! No more Google, go duck, go!

Online Miroslav Baláž

  • Hrdina
  • ****
  • Příspěvků: 271
  • Karma: 10
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
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

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 950
  • Karma: 43
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
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 Delfin »
I'm a soldier, so don't panic! I know the underground! No more Google, go duck, go!

Online Miroslav Baláž

  • Hrdina
  • ****
  • Příspěvků: 271
  • Karma: 10
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
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áž »

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 950
  • Karma: 43
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
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 Delfin »
I'm a soldier, so don't panic! I know the underground! No more Google, go duck, go!

Online Miroslav Baláž

  • Hrdina
  • ****
  • Příspěvků: 271
  • Karma: 10
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
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

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 950
  • Karma: 43
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
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.
I'm a soldier, so don't panic! I know the underground! No more Google, go duck, go!

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: