PostgreSQL 中数字之间的异或
所以我有两个整数> 2 ^ 63 - 1 但< 2^64-1。在大多数语言中,这是 BIGINT UNSIGNED,但根据 MySQL、PostgreSQL 和 SQLite 中数据库列类型的比较? (交叉映射),postogresql 中的 numeric(20)
问题是,当我尝试在两个无符号 bigint 之间进行 postgresql xor 操作时:
select 17418945696623429624::numeric(20) # 17418945696623429624::numeric(20);
=>
ERROR: operator does not exist: numeric # numeric
对于任何小于 2 ^ 63 -1 的非“数字”整数,它都可以正常工作。
改写:如何在大于 2 ^ 63 - 1 但小于 2 ^ 64 - 1 的两个数字之间执行 XOR 运算?前任。在 PostgreSQL 中如何将 17418945696623429624 与其自身进行异或?
So I have two integers > 2 ^ 63 - 1 but < 2 ^ 64 -1. This is BIGINT UNSIGNED in most languages, but according to Comparison of database column types in MySQL, PostgreSQL, and SQLite? (Cross-Mapping), its numeric(20) in postogresql
problem is, when I try to do a postgresql xor operation between two unsigned bigints:
select 17418945696623429624::numeric(20) # 17418945696623429624::numeric(20);
=>
ERROR: operator does not exist: numeric # numeric
with any non "numeric" integer less than 2 ^ 63 -1, it works fine.
rephrase: How can I perform a XOR operation between two numbers larger than 2 ^ 63 - 1 but less than 2 ^ 64 - 1? Ex. How can I XOR 17418945696623429624 with itself in PostgreSQL?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
看起来像 PostgreSQL 有一个 bigint 类型--你为什么不用那个?
Looks like PostgreSQL has a bigint type-- why don't you use that?
根据 PostgreSQL 文档:
numeric 属于 任意精度数字 (不是 整数类型),所以 XOR 运算符不是作品。
有(仅有符号)bigint 整数类型,但只有 -2^63 到 2^63 - 1。不幸的是,没有无符号 bigint 数据类型(即 0 到 2^64 -1)。
我认为可以使用 bigint 数据类型和一些“按位魔法”来实现这样的计算。
According to PostgreSQL documentation:
numeric belongs to Arbitrary Precision Numbers (not Integer Types), so XOR operator not works.
There is (only signed) bigint integer type, but it's only -2^63 to 2^63 - 1. Unfortunately there is no unsigned bigint datatype (i.e. 0 to 2^64 -1).
I think that it could be possible to implement such calculation using bigint datatype with some "bitwise magic".
我使用 pgplsql 创建了一系列按位运算符函数来满足这一确切要求。这是异或的示例:
其他运算符可以在这里找到: https://gist.github.com/ allfro/d93cbc6980f38cf309555eff77381ced
I've created a series of bitwise operator functions using pgplsql to accommodate for this exact requirement. Here's a sample of xor:
The other operators can be found here: https://gist.github.com/allfro/d93cbc6980f38cf309555eff77381ced