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 に答える