我创建了一个带有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)
}
}
它找不到行。我究竟做错了什么?
最佳答案
当您运行以下查询时:
insert into testhex (testhex) values ('\x123456');
您将3字节序列
[0x12 0x34 0x56]
插入表中。对于您正在使用QueryRow
执行的数据库查询,您正在搜索8个字符的文字字符串\x123456
,因此结果不匹配。当您将位置参数与
QueryRow
一起使用时,数据库适配器的工作就是将它们转换为数据库可以理解的格式(通过将它们作为绑定(bind)参数发送到数据库,或者通过适当的转义将它们替换为查询)。因此,通过传递一个已经转义的值,您将遇到这种问题。而是尝试传递
[]byte{0x12, 0x34, 0x56}
作为位置参数,该参数应与数据库中的值匹配。