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

Redshift 返回 []uint8 而不是整数,它们之间的转换返回不正确的值

Redshift 返回 []uint8 而不是整数,它们之间的转换返回不正确的值

Go
白猪掌柜的 2023-06-19 11:11:22
我有一个接受 SQL 查询的服务,使用数据库/sql 驱动程序在 Amazon Redshift 上运行查询。但是,我无法将结果转换为结构,因为查询是各种表上的大数据任务,而不是在此服务中创建的。所以我必须返回一个“松散”的数据结构。我正在解析返回到 JSON 中的数据并将其存储在 S3 中。但是,我在返回的数据类型方面遇到了一些奇怪的问题。对于数字列的查询返回 uint8 的映射而不是数字值。我知道这是因为数据库驱动程序无法决定将其转换为什么,因为它可能不精确。但我似乎也无法在 []uint8 和整数之间进行转换。这是我查询数据库的代码:// Execute executes SQL commandsfunc (r *Runner) Execute(query string, args ...interface{}) (types.Results, error) {    var results types.Results    rows, err := r.db.Query(query, args...)    if err != nil {        return results, err    }    columns, _ := rows.Columns()    colNum := len(columns)    values := make([]interface{}, colNum)    for i := range values {        var ii interface{}        values[i] = &ii    }    for rows.Next() {        rows.Scan(values...)        result := make(types.Result)        for i, colName := range columns {            rawValue := *(values[i].(*interface{}))            if reflect.TypeOf(rawValue).String() == "[]uint8" {                byteVal := rawValue.([]byte)                val := Intfrombytes(byteVal)                log.Println("Converted:", val)            }            result[colName] = rawValue        }        results = append(results, result)    }    return results, nil}我创建了以下函数来尝试在[]uint8和之间进行转换uint32。func Intfrombytes(bytes []uint8) uint16 {    bits := binary.LittleEndian.Uint16(bytes)    return bits}但是,如果我插入200该表,我会返回12339。一般来说,这种方法感觉很不稳定。我怀疑我为此使用 Go 的决定,因为我正在处理未定义的、松散的数据结构。是否有更好的方法来处理通用查询(例如我的示例),或者是否有方法可以将我的数字结果转换为整数?
查看完整描述

1 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

我认为您实际上可能正在解释一个字符串 ([]uint8 == []byte)。请参阅https://play.golang.org/p/Rfpey2NPiI7


originalValue := []uint8{0x32, 0x30, 0x30} // "200"

bValue := []byte(originalValue) // byte is a uint8 anyway

fmt.Printf("Converted to uint16: %d\n", binary.LittleEndian.Uint16(bValue))

fmt.Printf("Actual value: %s", string(bValue))

在处理pq一些加密代码之前,这让我很痛苦。


查看完整回答
反对 回复 2023-06-19
  • 1 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

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