从 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()
方法生成的随机包,该方法会生成您想要的内容。
我已尝试找到此问题的解决方案,但 运行 我对这个问题保持警惕。 此函数是 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()
方法生成的随机包,该方法会生成您想要的内容。