当我要求unsigned big int时,为什么Delphi(Zeos)在SQLite中给我提供了大字符串?

Mar*_*ius 0 mysql sql delphi sqlite zeos

我正在使用最新的Zeos和SQLite 3.一旦我们创建了所有持久性整数字段,它通常很顺利,从MySQL转换TLargeInt.

但是当我们使用列定义unsigned big int(根据https://www.sqlite.org/datatype3.html允许的唯一无符号类型)时,Delphi会调用结果字段a ftWidestring.

Arn*_*hez 6

不,它不会"恢复"为字符串,SQlite只是存储提供的数据.

正如文件所述:

SQLite支持列上的"类型亲和性"概念.列的类型亲缘关系是存储在该列中的数据的推荐类型.这里的重要思想是建议使用类型,而不是必需的.任何列仍然可以存储任何类型的数据.根据选择,某些列更倾向于使用一个存储类而不是另一个存储类.列的首选存储类称为"亲和性".

如果提供/绑定文本值,它将存储文本值.没有转换为CREATE TABLE语句中提供的类型,因为它可能出现在其他更严格的RBMS中,例如MySQL.

所以在你的情况下,如果你检索数据ftWideString,我想这是因为你把数据写成TEXT.例如,从MySQL创建SQLite3内容的工具或程序将此列写为TEXT.

关于数字,没有"签名"/"无符号",也没有SQLite3中的精确检查.因此,如果要存储"unsigned big int"值,只需使用INT64,即Int64.

但是,在所有情况下,即使SQLite3 API支持UNSIGNED 64位整数,sqlite3_uint64Zeos/ZDBC API或Delphi也很难支持这种类型(旧版本的Delphi不支持UInt64).可以肯定的是,您应该更好地检索TEXT这样的值,然后UInt64在Delphi代码中手动转换它.

更新:

你使用的TDataSet是Zeos提供的后代吗?此组件绑定DB.Pas,因此需要单个每列类型.它可能是您的代码混淆的根源(您根本没有显示,因此很难弄清楚发生了什么).

您应该更好地使用较低级别的ZDBC接口,该接口允许检索每行的列类型,并根据需要调用值getter方法.