sql >> Databáze >  >> RDS >> Mysql

Proč mi Delphi (Zeos) dává widestring pole v SQLite, když požádám o nepodepsaný velký int?

Ne, „nevrací se“ k řetězci, SQlite pouze ukládá data tak, jak jsou poskytnuta.

Jak uvádí dokumentace :

Pokud zadáte/svážete textovou hodnotu, uloží se textová hodnota. Neexistuje žádná konverze na typ zadaný v příkazu CREATE TABLE, protože může se objevují v jiných přísnějších RBMS, např. MySQL.

Takže ve vašem případě, pokud načtete data jako ftWideString , Předpokládám, že je to proto, že jste data zapsali jako TEXT. Například nástroj nebo program vytvářející obsah SQLite3 z vašeho MySQL zapisuje tento sloupec jako TEXT.

Pokud jde o čísla, v SQLite3 není žádné "podepsané"/"nepodepsané", ani kontrola přesnosti. Pokud tedy chcete uložit hodnoty "unsigned big int", stačí použít INTEGER, což je Int64.

Ale ve všech případech, i když SQLite3 API podporuje UNSIGNED 64bitová celá čísla , tento sqlite3_uint64 typ může být stěží podporován Zeos/ZDBC API nebo Delphi (starší verze Delphi NEpodporují UInt64). Abyste si byli jisti, měli byste raději načíst takové hodnoty jako TEXT a poté je převést jako UInt64 ručně v kódu Delphi.

Aktualizace:

Používáte TDataSet potomek poskytnutý firmou Zeos? Tato komponenta je svázána s DB.Pas , takže očekává jeden typ na sloupec. Může to být zdroj zmatku vašeho kódu (který jste vůbec neukázali, takže je těžké zjistit, co se děje).

Měli byste lépe používat rozhraní ZDBC nižší úrovně, které umožňuje načíst typ sloupce pro každý řádek a podle potřeby volat metodu získávání hodnot.



  1. Dotazy v dotazech:Existuje lepší způsob?

  2. Zabezpečení databáze v Oracle

  3. obnovení databáze selhalo s přesunem

  4. Jak vybrat hodnoty ve sloupci