我在执行查询时遇到了一些非常奇怪的不一致,想知道是否有人知道为什么。
假设我有一个定义如下的结构:
type Result struct {
Afield string `db:"A"`
Bfield interface{} `db:"B"`
Cfield string `db:"C"`
Dfield string `db:"D"`
}
以及具有以下列的 MySQL 表:
A : VARCHAR(50)
B : INT
C : VARCHAR(50)
D : VARCHAR(50)
我要执行的查询:
从表中选择 A、B、C、D WHERE A="a"
它可以执行的第一种方式:
db.Get(&result, `SELECT A, B, C, D FROM table WHERE A="a"`)
第二种执行方式:
db.Get(&result, `SELECT A, B, C, D FROM table WHERE A=?`, "a")
我遇到的不一致情况如下: 第一种方式执行查询时,Bfield 的类型是int. 但是,当第二次执行查询时,它是[]uint8。
例如,当 B 为 1 时,就会出现这种结果。
为什么 Bfield 的类型会根据查询的执行方式而有所不同?
连接声明:
// Connection is an interface for making queries.
type Connection interface {
Exec(query string, args ...interface{}) (sql.Result, error)
Get(dest interface{}, query string, args ...interface{}) error
Select(dest interface{}, query string, args ...interface{}) error
}
编辑
使用 Go 数据库/sql 包 + 驱动程序也会发生这种情况。下面的查询分别分配Bfield给[]uint8和int64。
db 是 *sql.DB 类型
查询 1:
db.QueryRow(SELECT A, B, C, D FROM table WHERE A="a").Scan(&result.Afield, &result.Bfield, &result.Cfield, &result.Dfield)
--> 类型Bfield是[]uint8
查询 2:
db.QueryRow(SELECT A, B, C, D FROM table WHERE A=?, "a").Scan(&result.Afield, &result.Bfield, &result.Cfield, &result.Dfield)
--> 类型Bfield是int64
编辑
还有一点需要注意,当链接多个 WHERE 子句时,只要使用 填充至少?1 个,查询就会返回int。否则,如果它们都填充在字符串中,它将返回[]uint8
慕尼黑8549860
浮云间
相关分类