我创建了一个带有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}作为位置参数,该参数应与数据库中的值匹配。

10-06 08:39