Golang中SQL查询因特殊字符“-”失败的处理方法

Golang中SQL查询因特殊字符“-”失败的处理方法 我正在使用 [sqlx],这是 Go 语言 database/sql 的通用扩展。

我在以下代码中遇到了针对特殊字符 “-” 的 UPDATE SQL 查询失败问题:

userData := "55cac6cc-c13f-4bfd-9d20"
...
queryUpdateUser := "UPDATE Users As u SET u.modified_by=?, u.modified_at=? WHERE u.uid=? AND u.userData IN (?)"

query, args, errSql := sqlx.In(queryUpdateUser, modby, modat, usrID, userData )
query = dc.Store.DB.Rebind(query)

_, err := tx.Exec(query, args...)  // 此语句执行失败

错误信息:Error 1054: Unknown column ‘55cac6cc’ in ‘where clause’\n" x-hptm-transaction-id=

如果有其他方法可以解决此问题,请告知。


更多关于Golang中SQL查询因特殊字符“-”失败的处理方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

sqlx.In 运行后,query 看起来是什么样子?

更多关于Golang中SQL查询因特殊字符“-”失败的处理方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是一样的… query = UPDATE Users As u SET u.modified_by=?, u.modified_at=? WHERE u.uid=? AND u.userData IN (?)

问题出在 sqlx.InIN (?) 子句的处理上。当 userData 是单个包含特殊字符(如 -)的字符串时,sqlx.In 会将其识别为列名而非字符串值,导致 SQL 语法错误。

以下是两种解决方案:

方案1:手动构建查询(推荐) 直接使用 Rebind 处理参数,避免 sqlx.In 的自动扩展:

userData := "55cac6cc-c13f-4bfd-9d20"
queryUpdateUser := "UPDATE Users As u SET u.modified_by=?, u.modified_at=? WHERE u.uid=? AND u.userData = ?"
query := dc.Store.DB.Rebind(queryUpdateUser)
_, err := tx.Exec(query, modby, modat, usrID, userData)

方案2:使用 Named Exec(当参数较多时)

type UserParams struct {
    ModifiedBy string `db:"modified_by"`
    ModifiedAt string `db:"modified_at"`
    UID        string `db:"uid"`
    UserData   string `db:"userData"`
}

params := UserParams{
    ModifiedBy: modby,
    ModifiedAt: modat,
    UID:        usrID,
    UserData:   userData,
}

queryUpdateUser := `
    UPDATE Users As u 
    SET u.modified_by=:modified_by, u.modified_at=:modified_at 
    WHERE u.uid=:uid AND u.userData=:userData`

_, err := tx.NamedExec(queryUpdateUser, params)

方案3:使用 sqlx.In 的正确方式(多值情况) 如果确实是 IN 子句多值查询,需要传入切片:

userData := []string{"55cac6cc-c13f-4bfd-9d20"} // 注意是切片
queryUpdateUser := "UPDATE Users As u SET u.modified_by=?, u.modified_at=? WHERE u.uid=? AND u.userData IN (?)"

query, args, _ := sqlx.In(queryUpdateUser, modby, modat, usrID, userData)
query = dc.Store.DB.Rebind(query)
_, err := tx.Exec(query, args...)

在你的场景中,由于是单个值匹配,方案1是最简洁直接的解决方案。

回到顶部