从sql响应读取uniqueidentifier时出现问题

jecbmhm3  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(260)

我曾试图找到解决这个问题的办法,但对这个问题我一直耿耿于怀。该函数是go-sql Package 器的一部分,调用getjson函数从sql响应中提取信息。
问题是,id参数变成jibberish并且与期望的响应不匹配,所有其他读取的参数都是正确的,所以这让我非常奇怪。
提前感谢您,对于您试图解决这个问题的任何尝试,我们非常感谢:-)

func getJSON(rows *sqlx.Rows) ([]byte, error) {
    columns, err := rows.Columns()
    rawResult := make([][]byte, len(columns))
    dest := make([]interface{}, len(columns))

    for i := range rawResult {
        dest[i] = &rawResult[i]
    }

    defer rows.Close()

    var results []map[string][]byte
    for rows.Next() {
        result := make(map[string][]byte, len(columns))
        rows.Scan(dest...)
        for i, raw := range rawResult {
            if raw == nil {
                result[columns[i]] = []byte("")
            } else {
                result[columns[i]] = raw
                fmt.Println(columns[i] + " : " + string(raw))
            }
        }

        results = append(results, result)
    }
    s, err := json.Marshal(results)
    if err != nil {
        panic(err)
    }
    rows.Close()
    return s, nil
}

从终端获取的响应示例:

id : r�b�X��M���+�2%
name : cat
issub : false

预期结果:

id : E262B172-B158-4DEF-8015-9BA12BF53225 
name : cat
issub : false
14ifxucb

14ifxucb1#

这与类型转换无关。
uuid(任何类型;目前有四个)被定义为一个128位长的字节块,即 128/8=16 字节。
这意味着任何字节-不一定可打印。
你要找的是uuid值的字符串表示,它
使用破折号分隔某些字节组。
使用十六进制(base-16)表示法格式化这些组中的每个字节。
由于base-16位置计数用一个数字('0'到'f')表示值0到15,因此一个字节由两个这样的数字表示—每组4位一个数字。
我认为任何合理的uuid包都应该实现一个“解码”函数/方法,该函数/方法将从这16个字节中产生一个字符串表示。
我选择了一个随机包,它是通过执行这个搜索查询生成的,并且 github.com/google/uuid.FromBytes 它从给定的字节片生成uuid,结果值的类型实现 String() 产生你想要的东西的方法。

相关问题