Я испытываю некоторые действительно странные несоответствия при выполнении запросов, и мне было интересно, если бы кто-нибудь знал почему.
Представьте, что у меня есть структура, определенная следующим образом:
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.
Почему тип поля B отличается в зависимостио том, как выполняется запрос?
объявление соединения:
// 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
}
EDIT
Это также происходит с помощью базы данных Go /Пакет SQL + драйвер.Приведенные ниже запросы присваивают Bfield
[]uint8
и int64
соответственно.
дБ имеет тип * 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
EDIT
Что еще нужно отметить при объединении в цепочку нескольких предложений WHERE, если не менее 1 заполняется с помощью ?
, запрос вернет int
.В противном случае, если они все заполнены в строке, он вернет []uint8