在MySQL中存储Python长整数有哪些选项?

时间:2013-06-01 00:26:42

标签: python mysql mysql-python

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

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

  

长整数

     
    

这些代表无限范围内的数字,仅受可用(虚拟)内存的限制。出于移位和掩码操作的目的,假设是二进制表示,而负数用2的补码表示,它给出了向左延伸的无限符号位串的错觉。

  

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

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

我想保留Python长整数定义的精神,这表明BLOB。我也想避免重新发明轮子,所以我吸引了stackoverflow蜂巢。

建议?

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

你可以腌制并存储为String。也许将String限制为VARCHAR(1000)?真的可以比这长吗?你必须了解你的申请。

>>> pickle.dumps(x)
'L122222222222222222222222222222222222222222222222222222222222222222223L\n.'
>>> x
122222222222222222222222222222222222222222222222222222222222222222223L
>>> 

答案 2 :(得分:1)

嗯,正如Python documentation所述,“长整数具有无限精度。”,从任何数据库的角度来看都是悲剧性的。您将不得不估计每个字段的最大值,您打算存储它们并选择最小大小整数数据类型,以确保您的数据库保持紧凑和高效。 BLOB不是您想要构建索引的类型。

答案 3 :(得分:0)

  

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

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

(我们):它不可能比这更大。
 (数据): THIS + 1
 (电脑):我该如何继续,船长?

这让我充满了疑问。

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

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

a)手术的确切性质。

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

假设我给你一个任意大数N,你想做一个操作a1。那么你可能会寻找一种表示N的方法,这样你就可以说出相应的数字M,它是指定输入N所需的固定长度步数。

关于这些数字的问题:

  • 您要从中检索哪些信息?
  • 他们会被操作/转换吗? (...和转换后保留了哪些数字属性?)
  • 他们会混杂(参与其他类型的计算)吗?
  • 对于近似或部分结果有什么意义吗?
  • 您希望他们如何表现? (你有什么不想发生的事吗?)
  • 表示的数据是否真正为整数:离散,可计算的数量是否以绝对精度测量?

它会帮助您检查预先存在的实现,还是找到进行此类数学运算的人? mpmath(最近)正在积极开发中。作者blogs regularly关于相关的上衣。而且,通常SAGE数学收集各种(渐近快速)库;其中有几个处理任意大数。


如果这些考虑是天真的或明显的,我道歉。