我需要在MySQL中表示Python“Long integer”的实例。我想知道我应该使用哪种最合适的SQL数据类型。
Python文档(v2.7)说(对于numbers.Integral):
长整数
这些代表无限范围内的数字,仅受可用(虚拟)内存的限制。出于移位和掩码操作的目的,假设是二进制表示,而负数用2的补码表示,它给出了向左延伸的无限符号位串的错觉。
我阅读MySQL文档表明BIGINT限制为64位。 DECIMAL类型似乎限制为65位。当然,我可以使用BLOB。
应用程序需要支持非常大量的数据,但我不知道这些长整数有多大,也不知道有多少我可能会看到。
我想保留Python长整数定义的精神,这表明BLOB。我也想避免重新发明轮子,所以我吸引了stackoverflow蜂巢。
建议?
答案 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数学收集各种(渐近快速)库;其中有几个处理任意大数。
如果这些考虑是天真的或明显的,我道歉。