sql - 从SQL响应读取uniqueidentifier问题

标签 sql go type-conversion uuid

我试图找到解决此问题的方法,但是请继续保持这种状态。
该函数是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字节。
这意味着任何字节-不一定可打印。
您所需要的是UUID值的字符串表示形式,

  • 使用破折号分隔某些字节组。
  • 使用hexadecimal(基数为16)表示形式来格式化这些组中的每个字节。

  • 由于以16为基数的位置计数使用一个数字(“0”至“F”)表示0到15的值,因此单个字节由两个这样的数字表示-每4位每组一个数字。
    我认为任何明智的UUID程序包都应实现“解码”功能/方法,以从这16个字节中生成字符串表示形式。
    我选择了一个通过执行this search query产生的随机包,它具有 github.com/google/uuid.FromBytes ,它从给定的 byte slice 中产生一个UUID,并且结果值的类型实现了 String() 方法,该方法产生了您想要的内容。

    关于sql - 从SQL响应读取uniqueidentifier问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62775561/

    相关文章:

    mysql - 当另一个表中不存在一个值时插入到表中?

    sql - Postgres 在一个表上多次执行 JOIN

    sql - 使用绑定(bind)和空值命中 Oracle 索引的最佳查询

    使用 STUFF 函数进行 SQL 查询需要很长时间

    http - 如何在 Go 中执行 HTTP 双工处理程序?

    go - 在 Golang 中解析时间秒到时钟

    c++ - 从派生类到基类成员变量类型的自动转换

    string - 如何在 MATLAB 中将元胞数组转换为数值

    go - 在 Iris Framework 的 POST 方法中重定向

    c - 是否值得更改 C 声明以增加类型安全性?