5

错误是

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

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

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

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

4

2 回答 2

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 类型或将 count(*) 转换为整数。

于 2013-06-11T16:54:52.520 回答
1

FromField模块中所述,postgresql-simple 仅在不存在溢出或精度损失的可能性时才在数字类型之间进行客户端转换。特别注意黑线鳕中的类型列表instance FromField Int:“int2、int4,如果编译为 64 位代码,则还有 int8。这个库被编译为 32 位代码。” 该评论的后半部分当然特定于 hackage 本身执行的构建。

在 32 位平台上, Int是 32 位整数,在 64 位平台上, Int是 64 位整数。如果你使用Int32你会得到同样的例外。您可以在两种平台上使用Int64或 任意精度类型来避免此问题。Integer

于 2013-12-05T13:50:48.400 回答