{"record":{"id":"dd3ec0548c18273d","repo":"alibaba/canal","slug":"unknown-json-packlen","errorCode":null,"errorMessage":"!! Unknown JSON packlen = ","messagePattern":"!! Unknown JSON packlen = ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/event/RowsLogBuffer.java","lineNumber":1056,"sourceCode":"                switch (meta) {\r\n                    case 1: {\r\n                        len = buffer.getUint8();\r\n                        break;\r\n                    }\r\n                    case 2: {\r\n                        len = buffer.getUint16();\r\n                        break;\r\n                    }\r\n                    case 3: {\r\n                        len = buffer.getUint24();\r\n                        break;\r\n                    }\r\n                    case 4: {\r\n                        len = (int) buffer.getUint32();\r\n                        break;\r\n                    }\r\n                    default:\r\n                        throw new IllegalArgumentException(\"!! Unknown JSON packlen = \" + meta);\r\n                }\r\n\r\n                if (partialBits.get(1)) {\r\n                    // print_json_diff\r\n                    int position = buffer.position();\r\n                    try {\r\n                        // https://github.com/alibaba/canal/pull/5018\r\n                        StringBuilder builder = JsonDiffConversion\r\n                            .print_json_diff(buffer, len, columnName, columnIndex, charset);\r\n                        value = builder.toString();\r\n                        buffer.position(position + len);\r\n                    } catch (IllegalArgumentException e) {\r\n                        buffer.position(position);\r\n                        // print_json_diff failed, fallback to parse_value\r\n                        parseJsonFromFullValue(len);\r\n                    }\r\n                } else {\r\n                    parseJsonFromFullValue(len);\r","sourceCodeStart":1038,"sourceCodeEnd":1074,"githubUrl":"https://github.com/alibaba/canal/blob/87be50e87686a3e8af08c368d0e1ffd1f59eb04a/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/event/RowsLogBuffer.java#L1038-L1074","documentation":"Thrown while decoding a MYSQL_TYPE_JSON column. Like BLOB, the metadata (meta) is the length-prefix size in bytes (1-4). The switch reads the data length as uint8/16/24/32; any other meta value is invalid. MySQL JSON is stored as a blob with a 1-4 byte length prefix, so meta outside 1-4 indicates corrupt or unrecognized table-map metadata.","triggerScenarios":"A Table_map_event declares a JSON column with a length-prefix meta of 0 or > 4, or Canal is too old to read the JSON encoding a newer MySQL emits.","commonSituations":"Replicating from MySQL 5.7+/8.0 with a Canal build predating JSON partial-update support; binlog corruption; a forked JSON diff format (see the partialBits.get(1) branch referencing PR #5018).","solutions":["Upgrade Canal to a release supporting the master's JSON binlog encoding (partial-update / JSON diff was added around PR #5018).","Confirm the JSON column exists on the master and Canal's schema cache is current.","Validate the binlog position with mysqlbinlog --hexdump.","Filter the table if JSON data is not required."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"boolean isValidJsonPacklen(int meta) {\n    return meta >= 1 && meta <= 4;\n}","typeGuard":null,"tryCatchPattern":"try {\n    buffer.fetchValue(name, index, type, meta, isBinary);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().startsWith(\"!! Unknown JSON packlen\")) {\n        logger.warn(\"Corrupt JSON packlen meta={} in tableId={}, skipping column\", meta, tableId);\n    } else throw e;\n}","preventionTips":["Use a Canal build that supports the master's JSON binlog encoding (incl. partial-update / JSON diff, PR #5018).","Validate the JSON column schema matches Canal's cached table map.","Filter JSON tables if the downstream does not need them."],"tags":["binlog","rows-buffer","column-type","json","parsing"],"backgroundTag":null,"analyzedSha":"87be50e87686a3e8af08c368d0e1ffd1f59eb04a","analyzedAt":"2026-08-14T04:30:11.918Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}