是否可以查询Azure表存储(NodeJS API)的整数> 2 ^ 30?

时间:2013-12-06 17:00:02

标签: node.js azure azure-storage azure-table-storage

在我的应用程序中,我将时间戳存储为我保存的每个实体的整数。当我稍后通过比较时间戳查询数据库时,我得到一个错误,如下所示:

Error: One of the request inputs is not valid.
RequestId:3b61f705-ca01-4742-981b-6e2332029874
Time:2013-12-06T16:49:42.0282802Z

经过大量调试后,我终于发现了发生了什么。在我的代码中,我有以下查询

    var query = azure.TableQuery
        .select()
        .from(self.tableName)
        .where('added gt ?', timestamp);

如果我将时间戳设置为Math.pow(2,30),一切似乎都很好,但是将它增加到Math.pow(2,31)会给我错误。我发现这种行为有点奇怪,因为Azure表存储类型中的是Int64类型。这基本上是利用它,我存储的值肯定比Int32大得多。

我最终解决了这个问题,方法是将值转换为DateTime,方法是在任何地方抛出新的Date(时间戳),但这应该是不必要的。任何人遇到这个,并设法将整数保存为整数?

2 个答案:

答案 0 :(得分:1)

Azure Table Storage API Int64文字必须使用L后缀。

var query = new azure.TableQuery()
   .where('loginTimeMS lt ?', 1406828512316);
query._where[0]+="L";

有效地将以下字符串放入表查询...

" loginTimeMS lt 1406828512316L"

注意最后的L.此查询将查找属性 loginTimeMS 小于1406828512316的实体,即 Int64

感觉就像一个解决方案 - 有兴趣听听是否有人找到了更优雅的解决方案。

答案 1 :(得分:0)

所以Javascript不支持传统方式的“整数”。请查看this answer on 64-bit integers

  

可以精确编码所有高达2 ^ 53的正整数。较大的   整数将其最低有效位削减。这离开了   你怎么能在javascipt中表示64位整数的问题    - 原生数字数据类型显然不能精确地表示64位int。

现在超出了这个问题,你似乎在32位屏障上遇到了问题。你检查过你的node.js版本了吗?适用于Windows的节点同时包含32 & 64-bit flavors

我怀疑您可能正在运行32位版本(x86)而不是64位版本(x64)。这可能会解决部分问题。

那说明,它不会解决上面的问题,因为你最终会遇到54位左右的问题。 Node.JS有several integer libraries available您可能需要使用。