为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 Go 将 Postgresql 数字和十进制列视为 []uint8?

为什么 Go 将 Postgresql 数字和十进制列视为 []uint8?

Go
一只名叫tom的猫 2021-11-01 10:55:17
我不确定这是 Go 中的错误还是我不明白的东西。我有以下几点:package mainimport (  "database/sql"  "log"  "reflect"  _ "github.com/lib/pq")func main() {  Db, err := sql.Open("postgres", "user=yoitsme password=openupitsme host=x.x.x.x dbname=mydb")  if err != nil {    log.Println(err)  }  rows, err := Db.Query("SELECT 1.3250::numeric, 8.548::decimal, 908.234::float, 1234::integer")  defer rows.Close()  for rows.Next() {    var col1, col2, col3, col4 interface{}    if err := rows.Scan(&col1, &col2, &col3, &col4); err != nil {      log.Println(err)    }    log.Println(col1, reflect.TypeOf(col1))    log.Println(col2, reflect.TypeOf(col2))    log.Println(col3, reflect.TypeOf(col3))    log.Println(col4, reflect.TypeOf(col4))  }  if err = rows.Err(); err != nil {    log.Println(err)  }}这打印:2015/08/11 09:35:47 [49 46 51 50 53 48] []uint82015/08/11 09:35:47 [56 46 53 52 56] []uint82015/08/11 09:35:47 908.234 float642015/08/11 09:35:47 1234 int64因此,对于实际上是数字的前两列,我得到 []uint8(例如字符串)。最后两列符合预期。根据 Postgresql数字和十进制类型是 SQL 标准的一部分。那么,为什么 Go 在他们的 database/sql 包中不遵循 SQL 标准呢?是因为 Go 没有内置的“十进制”类型吗?由于语言的缺陷,database/sql 包将数字转为字符串似乎是错误的....
查看完整描述

2 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

因为没有更好的解决方案。(至少在Go 1.5big.Float之前没有)。还有哪些其他选择?

  • 把它变成一个整数。显然是一个糟糕的解决方案,因为数字可以有小数部分。

  • 把它变成一个float64. 这是邪恶的。尤其是如果您正在处理金钱(类型喜欢numeric并且decimal使用最多的地方)。

这个特定的数据库驱动程序选择返回一个包含数字的字符串 - 让决定是失去一些精度(通过将其转换为float64with strconv)还是使用十进制/精确数字库(如gmpmath/big)。


查看完整回答
反对 回复 2021-11-01
  • 2 回答
  • 0 关注
  • 205 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信