2

我需要在 MySQL 中表示 Python“长整数”的实例。我想知道我应该使用哪种最合适的 SQL 数据类型。

Python 文档 (v2.7) 说(对于 numbers.Integral):

长整数

这些代表无限范围内的数字,仅受可用(虚拟)内存的影响。出于移位和屏蔽操作的目的,假定二进制表示,负数表示为 2 的补码的变体,这给出了向左延伸的无限符号位串的错觉。

我对 MySQL 文档的阅读表明 BIGINT 仅限于 64 位。DECIMAL 类型似乎限制为 65 位。当然,我可以使用 BLOB。

该应用程序需要支持非常大量的数据,但我还不知道这些长整数可能会有多大,也不知道我可能会看到多少。

我想保留 Python 长整数定义的精神,它建议 BLOB。我也想避免重新发明轮子,所以我很喜欢stackoverflow hive-mind。

建议?

4

4 回答 4

3

是的,如果您真的需要无限的精度,那么您将不得不使用 blob,因为即使是 strigns 也是有限的。

但实际上,我几乎可以保证您可以使用 NUMERIC/DECIMAL 数据类型。65 位表示可以表示 (-10^65, 10^65) 范围内的数字。这是多大?给你一些想法:整个宇宙中的原子数估计约为10 ^ 80。如果您只需要正数,您可以通过预先减去 10^65 -1 将范围进一步增加 2 倍。

于 2013-06-01T00:44:05.883 回答
2

您可以腌制并存储为字符串。也许将字符串限制为 VARCHAR(1000)?真的可以比这更长吗?您必须对您的应用有所了解。

>>> pickle.dumps(x)
'L122222222222222222222222222222222222222222222222222222222222222222223L\n.'
>>> x
122222222222222222222222222222222222222222222222222222222222222222223L
>>> 
于 2013-06-01T00:40:20.990 回答
1

好吧,正如 Python文档所述,“长整数具有无限精度。”从任何数据库的角度来看,这都是可悲的。您必须估计每个字段的最大值,您打算将它们存储在哪里,并选择最小大小的整数数据类型,以确保您的数据库保持紧凑和高效。BLOB 不是您想要建立索引的类型。

于 2013-06-01T00:38:43.687 回答
0

该应用程序需要支持非常大量的数据,但我还不知道这些长整数可能会有多大,也不知道我可能会看到多少。

所以你必须正视这种情况:

(我们):它不可能比这个更大。
(数据): THIS+1
(计算机): 舰长,我该怎么做?

这让我充满了疑问。

在选择(a)类型之前,您是否考虑过敲定一些方法?发明算术(匹配容器)听起来比制作容器来匹配数学要难。

第一个想法:假设您想在给定的时间内对确定的结果进行一些计算。随着输入大小无限制地增加,我认为有两件事变得越来越重要:

a) 操作的确切性质。

b) 定义收敛结果的程序。

假设我给你一个任意大的数 N,你想做操作 a1。然后您可能会寻找一种表示 N 的方法,以便您可以说明相应的数字 M,即在给定输入 N 的情况下,您完成 a1 所需的固定长度的步数。

关于这些数字的问题:

  • 你想从他们那里检索什么信息?
  • 他们会被操作/改造吗?(......以及在转换下保留了哪些数值属性?)
  • 它们会混杂(参与与其他类型的计算)吗?
  • 近似或部分结果有什么意义吗?
  • 你希望他们如何表现?(有没有你不想发生的事情?)
  • 表示的数据真的是整数吗:离散的、可枚举的量以绝对精度测量?

它会帮助您检查预先存在的实现,或者找到做这种数学的人吗? mpmath(最近)正在积极开发中。作者定期发布有关相关热门的博客。而且,总的来说,SAGE 数学收集了广泛的(渐近快速的)库;其中一些处理任意大的数字。


如果这些考虑是幼稚或显而易见的,我深表歉意。

于 2013-06-07T08:59:18.330 回答