# [FAQ] Sync_diff_inspector 检查失败但未打印 fixsql

## Key Words

FLOAT, DOUBLE, incompatible

## Description

使用 Sync_diff_inspector 验证 DM 上下游数据一致性，显示数据不一致，但 summary 中该表 UPCOUNT 及 DOWNCOUNT 是一致的，手动 count 该表上下游数据量也是一致的。并且，在 `export-fix-sql = true` 的条件下不打印任何 fixsql。

```sql
The following tables contains inconsistent data
+-----------------------------------------+--------------------+----------------+---------+-----------+
|                  TABLE                  | STRUCTURE EQUALITY | DATA DIFF ROWS | UPCOUNT | DOWNCOUNT |
+-----------------------------------------+--------------------+----------------+---------+-----------+
| `Scchema-A`.`Table-A` | true               | +0/-0          | 1099245 |   1099245 |
+-----------------------------------------+--------------------+----------------+---------+-----------+
```

## Content

1. Sync_diff_inspector 工具执行原理大致为，首先将对比数据分段，在上下游计算分段数据的 checksum 值，如果该值不一致会深入分段，通过二分扫描并在行级对比数据，当行数据存在差异后生成 fixsql， [分段 checksum 不一致后主要逻辑代码位置](https://github.com/pingcap/tidb-tools/blob/b505953aaa9ed289b71f3000cb7cb54fd09cd3e2/sync_diff_inspector/diff.go#L433-L449);
2. 将日志级别设置为 DEBUG，因为会发现产生 `count greater than threshold, start do bingenerate ...` 及 `bin generate finished ...` 说明在分段对比阶段已经产生了 checksum 值不一致，步入二分扫描和行级对比阶段，但并没有打印出任何 fix sql，说明在行级数据对比并未发现不一致;  
3. **本次的问题是因为 Sync_diff_inspector 在行级别对比阶段，会把从上下游取读到的数据**，并转成 go 对应的数据类型对比。从 MySQL 8.0.17 开始，非标准的 FLOAT(M,D)和 DOUBLE(M,D) 语法被[弃用](https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html)，并且 TiDB 不支持 MySQL 中标记为弃用的功能，即：指定浮点类型的精度。当 MySQL 对 float 数据设置精度时，查询结果会自动补 0，而[高版本 TiDB 则不会](https://github.com/pingcap/tidb/issues/22791)，导致 checksum 结果不一致的，但行级对比时会被转成 [go 数据类型](https://github.com/pingcap/tidb-tools/blob/98f55c7bc75d1521bf634ae16ccfdf1ed9ae22b1/sync_diff_inspector/utils/utils.go#L541-L547) 表现为对比一致，所以没打印出任何 fix-sql。 补 0 行为表现为如下测试;

    ```sql
    -- 高版本 TiDB
    create table test(a float(8,4));
    insert into test values(2.11);
    insert into test values(2.1100);
    select * from test;
    +--------+
    | a      |
    +--------+
    | 2.11   |
    | 2.11   |
    +--------+
    -- 低版本 MySQL
    create table test(a float(8,4));
    insert into test values(2.11);
    insert into test values(2.1100);
    select * from test;
    +--------+
    | a      |
    +--------+
    | 2.1100 |
    | 2.1100 |
    +--------+
    ```

4. 再次出现 "checksum 不一致，但未打印 fixsql" 现象时，请检查未通过的表是否存在 MySQL 高版本已经弃用且 TiDB 不支持的特性;
5. 本次的问题可以使用 [ignore-columns](https://docs.pingcap.com/zh/tidb/stable/sync-diff-inspector-overview#sync-diff-inspector-%E7%9A%84%E4%BD%BF%E7%94%A8%E9%99%90%E5%88%B6) 特性将该列忽略的方式绕过，详情参照官方使用方法。

## Affected Versions

关于本次 float 精度问题:  
MySQL < v8.0.17 (精度范围内自动补 0)  
TiDB  > v5.0.0 （精度范围内不自动补 0）
