数据库/sql Exec() 函数因连接字符串而失败

今天在Postgres使用database/sql驱动程序操作数据时发生了一个奇怪的错误github.com/lib/pq。我在 中创建了以下 SQL 架构Postgres:


CREATE TABLE IF NOT EXISTS bench_bytea (

    id INT PRIMARY KEY,

    name VARCHAR,

    data BYTEA

);

一个非常基本的表,包含类型为 的数据 blob BYTEA。


然后我尝试使用提供的函数执行简单的INSERT语句。这里是:Exec()database/sql


psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+

    "password=%s dbname=%s sslmode=disable",

    host, port, user, password, dbname)


db, err := sql.Open("postgres", psqlInfo)

if err != nil {

    panic(err)

}

defer db.Close()


stmt := `INSERT INTO bench_bytea (id, name, data) VALUES ($1, $2, $3) ON CONFLICT (id) DO NOTHING`

data := `{"title": "Sleeping Beauties", "genres": ["Fiction", "Thriller", "Horror"], "published": false}`

i := 0


_, err = db.Exec(stmt, i, "testing "+string(i), []byte(data))

if err != nil {

    panic(err)

}

关键的亮点发生在db.Exec()我执行 SQL INSERT 语句的行上(实际上i是一个数组的索引,我在其中存储了不同的测试data。我不想在这里包含其他数据,因为它真的很长并且不相关)。我收到的错误是:


pq: invalid byte sequence for encoding "UTF8": 0x00

现在,如果我更改"testing "+string(i)为"testing",错误就消失了。也就是说,如果我没有在name列中插入连接字符串,则不会出现错误。这里发生了什么?


函数式编程
浏览 82回答 1
1回答

茅侃侃

您无法将整数转换为这样的字符串。的结果string(0)是"\x00",又名空字节,而不是"0"您可能想要的。您应该改为使用strconv.Itoa转换。
打开App,查看更多内容
随时随地看视频慕课网APP