{"record":{"id":"fd8ddfba48db1d8c","repo":"alibaba/canal","slug":"unknow-useconds-meta","errorCode":null,"errorMessage":"unknow useconds meta : ","messagePattern":"unknow useconds meta : ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/event/RowsLogBuffer.java","lineNumber":1158,"sourceCode":"        return fNull;\r\n    }\r\n\r\n    public final int getJavaType() {\r\n        return javaType;\r\n    }\r\n\r\n    public final Serializable getValue() {\r\n        return value;\r\n    }\r\n\r\n    public final int getLength() {\r\n        return length;\r\n    }\r\n\r\n    public static String usecondsToStr(int frac, int meta) {\r\n        String sec = String.valueOf(frac);\r\n        if (meta > 6) {\r\n            throw new IllegalArgumentException(\"unknow useconds meta : \" + meta);\r\n        }\r\n\r\n        if (sec.length() < 6) {\r\n            StringBuilder result = new StringBuilder(6);\r\n            int len = 6 - sec.length();\r\n            for (; len > 0; len--) {\r\n                result.append('0');\r\n            }\r\n            result.append(sec);\r\n            sec = result.toString();\r\n        }\r\n\r\n        return sec.substring(0, meta);\r\n    }\r\n\r\n    public static void appendNumber4(StringBuilder builder, int d) {\r\n        if (d >= 1000) {\r\n            builder.append(digits[d / 1000])\r","sourceCodeStart":1140,"sourceCodeEnd":1176,"githubUrl":"https://github.com/alibaba/canal/blob/87be50e87686a3e8af08c368d0e1ffd1f59eb04a/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/event/RowsLogBuffer.java#L1140-L1176","documentation":"Thrown by usecondsToStr(int frac, int meta) when formatting the fractional (microsecond) part of a TIME/DATE/TIMESTAMP/DATETIME value. meta is the fractional-seconds precision (fsp) from the column metadata; MySQL supports fsp 0-6. A meta > 6 is impossible for a valid MySQL temporal type, so this guard catches corrupt metadata before it produces a nonsense string.","triggerScenarios":"A temporal column whose table-map metadata encodes a fractional precision > 6. Only reachable if the column metadata is corrupt or misread, since MySQL caps fsp at 6.","commonSituations":"Binlog corruption affecting a TIME(6)/DATETIME(6)/TIMESTAMP(6) column; a MySQL fork emitting non-standard fsp; buffer misalignment causing meta to be read from the wrong offset.","solutions":["Verify the temporal column's fractional precision on the master (must be 0-6).","Inspect the Table_map event and the offending row event with mysqlbinlog --hexdump.","Upgrade Canal to match the master version in case metadata encoding changed.","Filter the table if the temporal column is not required."],"exampleFix":"// before\nif (meta > 6) {\n    throw new IllegalArgumentException(\"unknow useconds meta : \" + meta);\n}\n// after: clamp to a valid precision and warn\nif (meta > 6) {\n    logger.warn(\"Unexpected useconds meta {}, clamping to 6\", meta);\n    meta = 6;\n}","handlingStrategy":"validation","validationCode":"static final int MAX_FSP = 6; // MySQL max fractional seconds precision\nboolean isValidUsecondsMeta(int meta) {\n    return meta >= 0 && meta <= MAX_FSP;\n}","typeGuard":null,"tryCatchPattern":"try {\n    RowsLogBuffer.usecondsToStr(frac, meta);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().startsWith(\"unknow useconds meta\")) {\n        // clamp and continue rather than abort the row\n        logger.warn(\"Invalid fsp meta={}, clamping to 6\", meta);\n        meta = 6;\n    } else throw e;\n}","preventionTips":["Confirm temporal column fsp on the master is 0-6.","Inspect binlog metadata for corruption when this fires.","Keep Canal aligned with the master version."],"tags":["binlog","rows-buffer","temporal","timestamp","parsing"],"backgroundTag":null,"analyzedSha":"87be50e87686a3e8af08c368d0e1ffd1f59eb04a","analyzedAt":"2026-08-14T04:30:11.918Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}