我们对财务数据使用小数。我确实看到 Quest 支持 float 和 double。 在我看来,使用 double 是一种浪费,所以我想存储为 float。与 int 和 long 相同。
我将此代码与 QuestDB 发送器一起使用来提取列
.Column(s_RateColumns[nameof(rate.Ask)], (float)rate.Ask)
.Column(s_RateColumns[nameof(rate.Bid)], (float)rate.Bid)
.Column(s_RateColumns[nameof(rate.Value)], (float)rate.Value)
.Column(s_RateColumns[nameof(rate.State)], (int)rate.State)
然而,在数据库中保留浮动类型时,我仍然得到双倍。在 int 上我会做多。
C#客户端与所有其他QuestDB官方客户端一样,使用ILP协议将数据发送到服务器。 ILP 是一种文本协议并假定 64 位数字。数据以UTF-8格式发送,无论客户端是float还是double都没关系。
如果已存在具有您发送的名称的表,则 QuestDB 会将列转换为表中定义的类型,只要它们兼容,否则会引发错误。
如果表不存在,或者您发送的列之一不存在,QuestDB 将使用默认值自动创建一个新表或一个新列。这是与 ILP 协议兼容的工具的标准,因为它允许在偶尔创建新列的环境中使用一些动态模式。
虽然自动创建表和列很方便,但它们使用默认值,因此可能并不理想。在这种情况下,即使您向客户端发送浮点数和整数,在接收端 QuestDB 也只会将数字视为字符串,并根据它是否有小数来创建 Double 或 Long。
如果您想确保数字按照您期望的数据类型存储,您始终可以在提取数据之前发出
CREATE TABLE
或 CREATE TABLE IF NOT EXISTS
语句。这可以使用 postgres 兼容库来完成,也可以直接通过调用 QuestDB REST API 的 /exec
端点来完成。
如果这是为了批量上传,您还可以使用 REST API 的
/imp
端点,该端点需要 CSV 并接受可选的架构定义。