踩坑系列之 mysql的effect rows
Posted 咖啡色的羊驼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了踩坑系列之 mysql的effect rows相关的知识,希望对你有一定的参考价值。
前言
这周的时候,和老铁就GoLang中mysql的“effect rows”这个问题讨论起来。
关键点在于:在进行update操作的时候,如果不进行更新(也可以理解为当前数据库就是这样子了)或者没这条数据,effect rows都会为0。
假设一个场景,需要区分这两种情况,就没法解决了。
正文
解决方案寻找过程
1. 命令行验证
通过命令行操作数据库,可以看到,mysql客户端是区分了matched的行数和changed的行数,是可以区分出来上文的情况的。
2. go-mysql包源码
终于找到方式了,那么go的mysql包是不是可以?
后面发现golang的mysql包结果的定义是这样:
type Result interface
LastInsertId() (int64, error)
RowsAffected() (int64, error)
竟然没有!!想象中的,Rows matched!!
3. 网上搜索
那只好在网上寻找解决方案:
这个老外说不可能,what·s your problem?
后面发现CLIENT_FOUND_ROWS蕴含着巨大的能量。
对于update且是CLIENT_FOUND_ROWS时affected_rows返回的是found的行数。
对于update且不是CLIENT_FOUND_ROWS是返回的是实际更新的行数。
4.实战验证
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main()
// 这里是默认情况:db, err := sql.Open("mysql", "root:@/test")
// 这里是能区分的情况
db, err := sql.Open("mysql", "root:@/test?clientFoundRows=true")
if err != nil
panic(1)
stmt, err := db.Prepare("update test set name=? where id=?")
if err != nil
panic(1)
res, err := stmt.Exec("34", 1)
effectRow, _ := res.RowsAffected()
fmt.Println(effectRow)
以上代码单纯考虑解决的角度看的,实际情况还需要考虑:
1.如果有使用mysql中间价的话,是不是开放了这个配置clientFoundRows?(因为据我了解这个不是单纯的开一个配置,对于中间价连接池的改造是有一定工作的)
2.开了这个配置之后,对于项目中现存的所有sql语句是否会产生未知的影响?
结论
记住clientFoundRows参数可以区分。
如果你觉得有收获~可以关注我的公众号【咖啡色的羊驼】~第一时间收到我的分享和知识梳理~
以上是关于踩坑系列之 mysql的effect rows的主要内容,如果未能解决你的问题,请参考以下文章
Mysql踩坑: Data truncation: Data too long for column ‘xxx‘ at row 1