与Database.PostgreSQL.Simple的count(*)类型兼容性错误?

时间:2013-06-07 19:04:29

标签: postgresql haskell postgresql-simple

错误是

*** Exception: Incompatible {errSQLType = "int8", errHaskellType = "Int", errMessage = "types incompatible"}

看起来查询中count(*)返回的任何值都必须转换为Integer而不是Int。如果我将这些特定变量更改为Integer类型,则查询可以正常工作。

但是在具有相同确切代码的另一台机器上没有引发此错误。第一台机器是32位,另一台机器是64位。这是我能辨别的唯一区别。

有没有人对正在发生的事情有任何见解?

2 个答案:

答案 0 :(得分:2)

PostgreSQL count()函数返回Bigint类型,参见

http://www.postgresql.org/docs/9.2/static/functions-aggregate.html

Bigint是8个字节  见http://www.postgresql.org/docs/9.2/static/datatype-numeric.html

Haskell int是~2 ** 29,这意味着它是一个4字节的整数。

http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-Int.html

然后,普通的PostgreSQL或其API不会进行精确的隐式向下转换。

因此,请使用Haskell int64类型或将计数(*)转换为整数。

答案 1 :(得分:1)

FromField模块中所述,postgresql-simple只会在没有任何溢出或精度损失的情况下进行数值类型之间的客户端转换。特别注意instance FromField Int的haddocks中的类型列表:“int2,int4,如果编译为64位代码,也是int8。这个库被编译为32位代码。”该评论的后半部分当然特定于hackage本身执行的构建。

在32位平台上,Int是32位整数,在64位平台上,Int是64位整数。如果您使用Int32,您将获得相同的例外情况。您可以使用Int64或任意精度Integer类型来避免在这两种平台上出现此问题。