如何查询到脏数据

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】
TiDB 版本4.0.8,添加唯一索引时报错

表结构为
CREATE TABLE operation_custom_tag_entity_new (
id bigint(20) NOT NULL AUTO_INCREMENT,
tag_id bigint(20) DEFAULT NULL,
base_id bigint(20) DEFAULT NULL,
entity_type int(11) DEFAULT NULL COMMENT ‘类型 实体关联表’,
qipu_id bigint(20) DEFAULT NULL COMMENT ‘奇谱ID’,
tag_name varchar(50) DEFAULT NULL COMMENT ‘自定义标签名称’,
source_sub_type varchar(100) DEFAULT NULL COMMENT ‘标签来源类型’,
PRIMARY KEY (id),
KEY idx_base_id (base_id),
KEY idx_tag_id (tag_id),
KEY idx_qipuId (qipu_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=923060000

查询qipu_id 字段为’'的值时,有4个warings, 应该是有数据被截断,想问如何查到这4条脏数据

理论上不管乐观事务还是悲观事务,都无法脏读。
要将事务隔离级别,设置为这个吗,没有试过
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

session 级别修改 sql mode 为空,然后查查看呢 :thinking:
还有,你是不是

tag_name

列为空啊

根据id 二分法?

sql_mode 设置为空 查询还是有被截断的值

是有为 null 的值

null 无所谓,null 不影响唯一索引,主要你是不是 name 列有 ‘’ 的导致有问题啊。
正常 int 类型是转为 0 的。如果 insert ‘’

is null 试试
不要 =’‘


目前的情况

id 查下 0 看看
表 admin check 下看看

数据量不大的话 这样查一下:

(root@10.102.58.180) [test]>SELECT qipu_id, tag_name, COUNT(*) as cnt
    -> FROM operation_custom_tag_entity_new
    -> GROUP BY qipu_id, tag_name
    -> HAVING cnt > 1;
+---------+----------+-----+
| qipu_id | tag_name | cnt |
+---------+----------+-----+
|       0 |          |   2 |
+---------+----------+-----+
1 row in set (0.01 sec)

这个结果集有3W多条-,- 我估计得找开发一点点清理了

就这样吧。

:flushed:这个结果是怎么样的?没理解为什么is null和= ''都查不出来

说明他的数据不是 null 也不是空

事物隔离

:thinking:哦,这意思是这个字段不为空也不为null,只是因为截断转换成0了。

哦 不是 我是说贴主重复的不是 null 也不是空

我这里是 demo 。我写了重复数据罢了

1 个赞

https://bugs.mysql.com/bug.php?id=46641&error=un