3

我创建了一个带有 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)
        }
    }

它没有找到该行。我究竟做错了什么?

4

1 回答 1

3

当您运行以下查询时:

insert into testhex (testhex) values ('\x123456');

您将 3 字节序列[0x12 0x34 0x56]插入到表中。但是,对于您正在执行的数据库查询QueryRow,您正在搜索 8 个字符的文字字符串\x123456,因此结果中没有匹配项。

当您将位置参数与 一起使用时QueryRow,数据库适配器的工作是将它们转换为数据库可以理解的形式(通过将它们作为绑定参数发送到数据库,或者通过适当的转义将它们替换到查询中)。因此,通过传递一个已经转义的值,您将遇到此类问题。

相反,尝试[]byte{0x12, 0x34, 0x56}作为位置参数传递,它应该与数据库中的内容相匹配。

于 2014-12-13T02:13:17.207 回答