带有十六进制值的Golang + Postgres WHERE子句

时间:2014-12-12 02:01:08

标签: postgresql go hex bytea

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

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

1 个答案:

答案 0 :(得分:2)

运行以下查询时:

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

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

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

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