diff --git a/sync_diff_inspector/diff.go b/sync_diff_inspector/diff.go index 4b2ba8042..9a3d6384f 100644 --- a/sync_diff_inspector/diff.go +++ b/sync_diff_inspector/diff.go @@ -446,7 +446,7 @@ func (df *Diff) consume(ctx context.Context, rangeInfo *splitter.RangeInfo) bool if err != nil { df.report.SetTableMeetError(schema, table, err) } - isEqual = isEqual && isDataEqual + isEqual = isDataEqual } dml.node.State = state id := rangeInfo.ChunkRange.Index diff --git a/sync_diff_inspector/utils/utils.go b/sync_diff_inspector/utils/utils.go index 78cfccfd4..75f2aab82 100644 --- a/sync_diff_inspector/utils/utils.go +++ b/sync_diff_inspector/utils/utils.go @@ -16,8 +16,10 @@ package utils import ( "context" "database/sql" + "encoding/json" "fmt" "math" + "reflect" "sort" "strconv" "strings" @@ -533,6 +535,22 @@ func CompareData(map1, map2 map[string]*dbutil.ColumnData, orderKeyCols, columns if math.Abs(num1-num2) <= 1e-6 { continue } + } else if column.FieldType.GetType() == mysql.TypeJSON { + if (str1 == str2) || (data1.IsNull == data2.IsNull) { + continue + } + var v1, v2 any + err := json.Unmarshal(data1.Data, &v1) + if err != nil { + return false, 0, errors.Errorf("unmarshal json %s failed, error %v", str1, err) + } + err = json.Unmarshal(data2.Data, &v2) + if err != nil { + return false, 0, errors.Errorf("unmarshal json %s failed, error %v", str2, err) + } + if reflect.DeepEqual(v1, v2) { + continue + } } else { if (str1 == str2) && (data1.IsNull == data2.IsNull) { continue