【 TiDB 使用环境】生产环境 or 测试环境 or POC
poc
【 TiDB 版本】
4.0.14 和 5.4.1
【遇到的问题】
不同where条件加上括号后的sql 查询结果一样。
【复现路径】做过哪些操作出现的问题
package main
import (
"encoding/json"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
"github.com/pkg/errors"
)
/*
CREATE TABLE `tidb_demo` (
`id` INT UNSIGNED AUTO_INCREMENT COMMENT '主键id',
`num` INT NOT NULL DEFAULT '0' COMMENT '数量',
`img` VARCHAR(256) NOT NULL DEFAULT '图片链接',
PRIMARY KEY (`id`),
UNIQUE INDEX de(`num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT 'demo表';
INSERT INTO tidb_demo(`id`,`num`,`img`) VALUES(1,1,'http://demo.com/demo1.png'),(2,2,'http://demo.com/demo2.png');
*/
// TidbDemo demo表
type TidbDemo struct {
Id int64 `db:"id" json:"id"` // 主键id
Num int64 `db:"num" json:"num"` // 数量
Img string `db:"img" json:"img"` // 图片链接
}
type Config struct {
DbName string
Host string
Port string
User string
Password string
Charset string
MaxIdleCons int
MaxOpenCons int
}
func main() {
// 创建数据库链接
// TODO: 填充数据库链接信息
dbCfg := &Config{}
dbCfg.DbName = "test"
dbCfg.Host = "" //541
//dbCfg.Host = "" // 4014
dbCfg.Port = ""
dbCfg.User = ""
//dbCfg.User = "root"
dbCfg.Password = ""
//dbCfg.Password = ""
dbCfg.Charset = "utf8mb4"
db := newSqlInstance(dbCfg)
// 第一次执行sql
const querySql = "SELECT * FROM tidb_demo WHERE (id = ?)"
res1 := &TidbDemo{}
if err := db.Get(res1, querySql, 1); err != nil {
fmt.Println(errors.WithStack(err))
return
}
fmt.Println("1 time:", unsafeJsonToStr(res1))
// 第二次执行sql
res2 := &TidbDemo{}
if err := db.Get(res2, querySql, 2); err != nil {
fmt.Println(errors.WithStack(err))
return
}
fmt.Println("2 time:", unsafeJsonToStr(res2))
fmt.Println()
// 非主键字段
const querySql2 = "SELECT * FROM tidb_demo WHERE (num = ?)"
res3 := &TidbDemo{}
if err := db.Get(res3, querySql2, 1); err != nil {
fmt.Println(errors.WithStack(err))
return
}
fmt.Println("非主键字段 1 time", unsafeJsonToStr(res3))
// 第二次执行sql
res4 := &TidbDemo{}
if err := db.Get(res4, querySql2, 2); err != nil {
fmt.Println(errors.WithStack(err))
return
}
fmt.Println("非主键字段 2 time", unsafeJsonToStr(res4))
}
func newSqlInstance(conf *Config) *sqlx.DB {
charset := conf.Charset
if charset == "" {
charset = "utf8,utf8mb4"
}
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s", conf.User, conf.Password, conf.Host, conf.Port, conf.DbName, conf.Charset)
fmt.Println("dsn", dsn)
db := sqlx.MustConnect("mysql", dsn)
if conf.MaxIdleCons != 0 {
db.SetMaxIdleConns(conf.MaxIdleCons)
}
if conf.MaxOpenCons != 0 {
db.SetMaxOpenConns(conf.MaxOpenCons)
}
return db.Unsafe()
}
func unsafeJsonToStr(data interface{}) string {
raw, _ := json.Marshal(data)
return string(raw)
}
【问题现象及影响】
- 通过proxysql 2.3.2 去连接tidb集群会出现这个问题
- 通过tidb直接连接则不会有这个问题
【附件】
请提供各个组件的 version 信息,如 cdc/tikv,可通过执行 cdc version/tikv-server --version 获取。