Python 和 MySQL - 数字类型有限? [重复]

问题描述 投票:0回答:1

我正在尝试使用MySQL保存一些时间序列布尔数据,然后根据保存的数据做出决定。

我需要保存最后144个样本,然后检查是否有超过X%的非零值。

我尝试使用规模为 44 的

Numeric
字段。在某些时候,数据被截断为 9999999999。

这就是我创建专栏的方式:

op.add_column('object', sa.Column('data_history',        sa.Numeric(scale=44), nullable=False, default=0))

这是我处理计算的代码:

happens_now = data < DATA_THRESHOLD
mask = 0
for i in xrange(144):
    mask <<= 1
    mask |= 1
safe_logging.info('History: {} LongHistory: {}'.format(my_object.data_history, long(my_object.data_history)))
my_object.data_history *= 2
safe_logging.info('History: {} LongHistory: {}'.format(my_object.data_history, long(my_object.data_history)))
my_object.data_history += happens_now
safe_logging.info('History: {} LongHistory: {}'.format(my_object.data_history, long(my_object.data_history)))
history_to_consider = long(my_object.data_history) & mask
safe_logging.info('Mask: {} Data: {} Happens now: {} History: {}'.format(mask, data, happens_now, history_to_consider))
pop_count = self._PopCount(history_to_consider)
if (not my_object.is_total) and pop_count/144 > PERCENTAGE_THERSHOLD:
    my_object.is_total = True

这是我两次连续数据插入的日志输出:

INFO:  History: 8589934591 LongHistory: 8589934591
INFO:  History: 17179869182 LongHistory: 17179869182
INFO:  History: 17179869183 LongHistory: 17179869183
INFO:  Mask: 22300745198530623141535718272648361505980415 Data: 10 Happens now: True History: 17179869183

INFO:  History: 9999999999 LongHistory: 9999999999
INFO:  History: 19999999998 LongHistory: 19999999998
INFO:  History: 19999999999 LongHistory: 19999999999
INFO:  Mask: 22300745198530623141535718272648361505980415 Data: 10 Happens now: True History: 19999999999

我试图在 MySQL 文档中找到限制,但找不到。 Python 似乎可以很好地处理长数字(请参阅掩码)。

这是 SQLAlchemy 的限制吗?我错过了一些 MySQL 限制?

python mysql sqlalchemy
1个回答
0
投票

因此,正如@Shadow 指出的那样,我混淆了规模和精度。

小数位数是小数点后的位数,精度是总位数。

此外,最大精度为 30,因此我必须连接两个左右的 BigInt,以获得更大的数字。

© www.soinside.com 2019 - 2024. All rights reserved.