TiDB 5.0.4 MySQL查询与TiDB结果不一致

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:

【概述】
MySQL和TiDB数据一致前提下,同一SQL在MySQL和TiDB返回结果不一致。

【现象】

select git_mr.I_MR_ID 
from table1 join table2 on table1.I_MR_ID = table2.I_MR_ID 
where 
1=1
and table2.D_UPDATED_AT >= '2023-06-01' and table2.D_UPDATED_AT <= '2023-06-11'
and table1.CH_USER_NAME != table2.CH_OPEN_USER_NAME
and CH_NOTE_TYPE="statsxxx" 
and CH_USER_NAME not in ('aaa', 'bbbb.fe') 
and CH_NOTE like 'cccc'    -- 去掉此条件后,查询结果一致。
and CH_STATE = "xxxxx"
and table2.CH_GROUP  NOT LIKE "%.%"
group by table2.I_MR_ID;

【TiDB 版本】

  • TiDB版本:5.0.4

  • MySQL版本:5.7.32

  • 补充说明: 初步定位是 case-insensitive 导致。
    去掉其中一个where条件后, CH_NOTE like 'cccc' MySQL和TiDB查询结果一致。

这是实时数据还是存量数据?先判断下是不是有在更新数据~

如果 MySQL 和 TiDB 的数据是一致的,但是同一 SQL 在 MySQL 和 TiDB 中返回的结果不一致,可能是由于以下原因导致的:

  1. SQL 语法不兼容:MySQL 和 TiDB 在 SQL 语法上存在一些差异,例如 TiDB 不支持 MySQL 的一些语法,或者 TiDB 的语法实现与 MySQL 不同。如果 SQL 语法不兼容,可能会导致在 MySQL 和 TiDB 中执行相同的 SQL 语句时返回的结果不一致。

  2. 数据类型不兼容:MySQL 和 TiDB 在数据类型上存在一些差异,例如 TiDB 支持更多的数据类型,或者 TiDB 的数据类型实现与 MySQL 不同。如果 SQL 语句中使用了不兼容的数据类型,可能会导致在 MySQL 和 TiDB 中执行相同的 SQL 语句时返回的结果不一致。

  3. 数据库参数不一致:MySQL 和 TiDB 在一些数据库参数上存在一些差异,例如 TiDB 的默认字符集和排序规则与 MySQL 不同,或者 TiDB 的默认隔离级别与 MySQL 不同。如果数据库参数不一致,可能会导致在 MySQL 和 TiDB 中执行相同的 SQL 语句时返回的结果不一致。

  4. 数据库数据不一致:虽然 MySQL 和 TiDB 的数据是一致的,但是在某些情况下,可能会存在数据不一致的情况。例如,MySQL 和 TiDB 的数据同步存在延迟,或者在数据同步过程中出现了错误。如果数据库数据不一致,可能会导致在 MySQL 和 TiDB 中执行相同的 SQL 语句时返回的结果不一致。

为了确定具体原因,可以逐步排查。可以先检查 SQL 语法和数据类型是否兼容,然后检查数据库参数是否一致,最后检查数据库数据是否一致。如果无法确定原因,可以提供更多的信息,例如 SQL 语句、表结构、数据类型、数据库参数等,以便更好地帮助您解决问题。

DM实时同步到TiDB,校验多次,数据均一致

会不会是执行SQL的客户端设置autocommit=0导致查的是快照数据?

建议查下少的那些行有什么特点

发现TiDB和MySQL的排序规则不一致。(5.0版本默认不兼容MySQL部分字符集,排序规则)

https://docs.pingcap.com/zh/tidb/stable/character-set-and-collation#新框架下的排序规则支持

https://docs.pingcap.com/zh/tidb/stable/tidb-configuration-file#new_collations_enabled_on_first_bootstrap

跟进提问:如果使用滚动升级方法,参数会调整么?
如果集群使用主从切换升级方法,是否需要调整 new_collation_enabled 参数?

case-insensitive 问题是针对大小写判断的吧,和like是否有关?

目前看是有关的 CH_NOTE like 'cccc'CH_NOTE like 'CCCC' 大小写变换后,结果不一致。

结论反馈:
new_collations_enabled_on_first_bootstrap = false时,tidb的utf8mb4字符集和排序集分别是utf8mb4utf8mb4_binutf8mb4_bin 排序集区分大小写。

https://docs.pingcap.com/zh/tidb/stable/mysql-compatibility#字符集和排序规则

2 个赞