我创建了一个带有BYTEA字段的简单sql数据库,
create table testhex (testhex bytea);
insert into testhex (testhex) values ('\x123456');
然后我尝试从Go查询。
package main
import (
"database/sql"
_ "github.com/lib/pq"
)
func main(){
var err error
db, err := sql.Open("postgres", "dbname=testhex sslmode=disable")
if err != nil {
panic(err)
}
var result string
err = db.QueryRow("select testhex from testhex where testhex = $1", `\x123456`).Scan(&result)
if err != nil {
panic(err)
}
}
它没有找到该行。我做错了什么?
答案 0 :(得分:2)
运行以下查询时:
insert into testhex (testhex) values ('\x123456');
您将3字节序列[0x12 0x34 0x56]
插入表中。对于您使用QueryRow
执行的数据库查询,您正在搜索8个字符的文字字符串\x123456
,因此您在结果中没有匹配。
当您使用QueryRow
的位置参数时,数据库适配器的工作就是将它们转换为数据库理解的形式(通过将它们作为绑定参数发送到数据库,或者通过替换它们)通过适当的转义进入查询)。因此,通过传递已经转义的值,您将遇到这类问题。
相反,尝试传递[]byte{0x12, 0x34, 0x56}
作为位置参数,该参数应该与数据库中的匹配。