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
在 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.In 对 IN (?) 子句的处理上。当 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是最简洁直接的解决方案。

