MariaDB导入网络流量CSV时字段数据类型匹配及报错求助
问题核心错误点
当前报错全部来自表结构错配、导入规则缺失两个问题,对应三类报错的根因:
- 错误4025 JSON校验失败:pandas输出的
object类型指代普通字符串,不是结构化JSON格式。将IP、协议、流量详情这类纯文本字段设置为JSON类型后,MariaDB会强制校验输入内容必须符合JSON语法(要求键值对用双引号包裹、特殊字符转义),但CSV中存储的192.168.1.1、TCP这类纯字符串完全不符合JSON规范,直接触发约束报错。 - 错误1366 类型不匹配:定义的表字段顺序和CSV原生字段顺序不一致——CSV字段顺序是
No.、Time、Source、Destination、Protocol、Length、Info,但原表结构把Info放在了Length前面,导入时如果不指定列映射,会把字符串类型的Info内容塞进整型的Length字段,触发类型不匹配。 - 错误1062 主键重复:要么是之前导入失败的残留数据未清空,要么是字段错位后非序号列的值被塞入主键字段触发重复,少数情况是CSV中
No.列本身存在重复值。
正确操作步骤
第一步:重建匹配字段类型的表
不要给普通文本字段设置JSON类型,IP地址字段用VARCHAR兼容IPv4/IPv6长度,长文本的流量详情用TEXT类型避免截断,直接执行以下SQL:
DROP TABLE IF EXISTS table_prueba; CREATE TABLE table_prueba ( `No.` BIGINT PRIMARY KEY, `Time` FLOAT, `Source` VARCHAR(45), `Destination` VARCHAR(45), `Protocol` VARCHAR(20), `Length` BIGINT, `Info` TEXT ) DEFAULT CHARSET=utf8mb4;
若确认CSV中No.列本身存在重复值,将主键改为自增ID即可规避重复报错:
DROP TABLE IF EXISTS table_prueba; CREATE TABLE table_prueba ( id BIGINT PRIMARY KEY AUTO_INCREMENT, `No.` BIGINT, `Time` FLOAT, `Source` VARCHAR(45), `Destination` VARCHAR(45), `Protocol` VARCHAR(20), `Length` BIGINT, `Info` TEXT ) DEFAULT CHARSET=utf8mb4;
第二步:执行正确的导入命令
LOAD DATA必须明确指定分隔符、忽略表头、列映射关系,避免字段错位,根据CSV生成系统调整换行符参数:
LOAD DATA LOCAL INFILE '替换为你的CSV文件绝对路径' INTO TABLE table_prueba CHARACTER SET utf8mb4 FIELDS TERMINATED BY ',' ENCLOSED BY '"' -- Windows导出的CSV用'\r\n',Linux/macOS导出的CSV用'\n' LINES TERMINATED BY '\r\n' -- 忽略第一行表头 IGNORE 1 LINES -- 列顺序必须和CSV内的字段顺序完全一致 (`No.`, `Time`, `Source`, `Destination`, `Protocol`, `Length`, `Info`);
导入后校验
导入完成后执行SHOW WARNINGS;查看剩余警告,如果没有严重错误,执行SELECT COUNT(*) FROM table_prueba;核对行数和CSV数据行数是否一致即可。
内容的提问来源于stack exchange,提问作者cbcliff47
相关产品推荐
相关产品推荐

