从 SQL 响应中读取 uniqueidentifier 时出现问题

Problem reading uniqueidentifier from SQL response

我已尝试找到此问题的解决方案,但 运行 我对这个问题保持警惕。 此函数是 Go SQL 包装器的一部分,调用函数 getJSON 以从 sql 响应中提取信息。

问题 是,id 参数变得乱七八糟,与所需的响应不匹配,你读取的所有其他参数都是正确的,所以这真的让我很奇怪。

在此先感谢您,如果您尝试解决此问题,我们将不胜感激:-)

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

这与类型转换无关。

UUID(任何类型;目前有四种)被定义为 128 位长的字节块,即 128/8=16 字节。
这意味着 any 字节 — 不一定是可打印的。

你想要的是 UUID 值的字符串表示,

  • 使用破折号分隔某些字节组。
  • 使用 hexadecimal(base-16)表示法格式化这些组中的每个字节。

由于 base-16 位置计数使用单个数字('0' 到 'F')表示值 0 到 15,因此单个字节由两个这样的数字表示 - 每组 4 位一个数字.

我认为任何合理的 UUID 包都应该实现一个“解码”function/method,它会从这 16 个字节中产生一个字符串表示。
我选择了一个通过执行 this search query, and it has github.com/google/uuid.FromBytes which produces an UUID from a given byte slice, and the type of the resulting value implements the String() 方法生成的随机包,该方法会生成您想要的内容。