簡體   English   中英

Postgresql C如何將uint64_t轉換為數字?

[英]Postgresql C How to convert uint64_t into numeric?

Postgres不支持uint64_t,最大的整數類型是BIGINT,其范圍等於int64。 我需要從C函數返回一個unit64_t var,如何將其轉換為數字,然后才能從函數中返回數字?

C的uint64_tint64_t可相互轉換而不會丟失信息(采用二進制補碼算法,但我懷疑您使用的是UNIVAC),因此您可以將所有uint64_t數量轉換為int64_t然后再將其寫入數據庫並返回uint64_t閱讀。

但是,存在一些潛在的問題。 首先,如果您需要在相關的數據庫列中存儲實際的負數, 則不要執行此操作,因為當您讀回它們時,您將無法分辨出它們是負數還是大於2 63 -1的數字。 同樣,所有SQL操作會將大於2 63 -1的所有數字都視為負數。 這可能是問題,也可能不是問題,這取決於您將這些大量數字用於什么以及涉及它們的查詢趨向於多么復雜。

編輯:我剛剛意識到,“數字”可能意味着PostgreSQL的任意精度NUMERIC列類型。 不幸的是,我在文本SQL級別以下找不到任何有關如何使用此類型的文檔的運氣。 我唯一可以建議的就是讓您閱讀用於在C語言中編寫服務器端擴展的頭文件和/或在pg郵件列表上尋求幫助。

我找不到直接處理此轉換的現有函數。 更糟糕的是,用於構建NUMERIC值的所有結構和函數似乎都numeric.c本地,並且附帶的標頭中並沒有太多用處,因此我不確定您期望如何構建它們自己(看起來我們不是第一個注意到這一點的人 )。

似乎這基本上將您限制在類型的SQL級別的API(即內置的類型轉換和算術運算)上。 我認為TEXT是唯一可轉換為NUMERIC且足夠寬以容納uint64其他SQL類型。 換句話說,最簡單的方法可能是將您的值轉換為字符串,然后將其傳遞給NUMERIC解析例程,例如:

char uint64_string [21];
sprintf(uint64_string, "%" PRIu64, uint64_val);
PG_RETURN_DATUM(DirectFunctionCall3(numeric_in, CStringGetDatum(uint64_string), 0, -1));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM