4.0 KiB
4.0 KiB
数据同步问题最终解决方案
🎯 问题总结
✅ 已确认的事实
- 数据库字段长度已修复:latitude, longitude等字段已扩展为VARCHAR(500)
- 手动插入成功:单条记录可以成功插入到xq_client_log表
- 其他设备类型正常:耳标(3872条)和主机(934条)数据同步正常
- 问题定位:项圈设备数据在批量插入时失败
- 数据检查结果:latitude数据最长只有18字符,远小于VARCHAR(500)限制
❌ 仍然存在的问题
- 批量插入失败:
Data truncation: Data too long for column 'latitude' at row 9 - 逐条插入也失败:改进后的逐条插入逻辑也没有成功
- 项圈日志数量:始终为1条(手动插入的那条)
🔍 深度分析
关键发现
从数据检查结果可以看到:
- latitude数据本身没有问题:最长只有18字符
- 字符编码正常:LENGTH和CHAR_LENGTH相同
- 数据格式正常:都是标准的数字格式
可能的原因
- 其他字段问题:可能是其他字段(如longitude、device_voltage等)导致截断
- 批量插入时的数据转换问题:可能在批量插入时数据格式发生了变化
- MyBatis映射问题:可能存在字段映射的细微问题
- 数据库约束问题:可能存在其他隐藏的数据库约束
🛠️ 已尝试的解决方案
✅ 已实施
- 数据库字段长度修复:VARCHAR(500)
- 代码长度限制移除:移除50字符限制
- 字段映射修复:修复SQL中的字段名映射
- 逐条插入备用方案:批量插入失败时尝试逐条插入
- 严格数据验证:添加200字符的安全截断
- 应用重启:确保使用最新的代码
❌ 仍然失败
- 所有改进都没有生效
- 项圈数据仍然无法插入到xq_client_log表
📊 当前状态
| 设备类型 | 同步状态 | 记录数量 | 说明 |
|---|---|---|---|
| 耳标 | ✅ 成功 | 3872 | 正常工作 |
| 主机 | ✅ 成功 | 934 | 正常工作 |
| 项圈 | ❌ 失败 | 1 | 批量插入失败 |
🎯 建议的下一步
方案1:深度数据检查
-- 检查所有字段的长度
SELECT
device_id,
latitude,
longitude,
voltage,
temperature,
steps,
same_day_steps,
LENGTH(CAST(latitude AS CHAR)) as lat_length,
LENGTH(CAST(longitude AS CHAR)) as lng_length,
LENGTH(CAST(voltage AS CHAR)) as voltage_length,
LENGTH(CAST(temperature AS CHAR)) as temp_length,
LENGTH(CAST(steps AS CHAR)) as steps_length,
LENGTH(CAST(same_day_steps AS CHAR)) as same_day_steps_length
FROM iot_device_data
WHERE device_type = 4
ORDER BY LENGTH(CAST(latitude AS CHAR)) DESC
LIMIT 10;
方案2:检查数据库约束
-- 检查xq_client_log表的约束
SELECT
CONSTRAINT_NAME,
CONSTRAINT_TYPE,
COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'xq_client_log';
方案3:简化测试
-- 尝试插入最简单的数据
INSERT INTO xq_client_log (
device_id,
device_voltage,
device_temp,
server_device_id,
latitude,
longitude,
walk_steps,
y_walk_steps,
create_time,
create_by,
update_time,
update_by
) VALUES (
'TEST_DEVICE',
'3.3',
'25.8',
'TEST_SERVER',
'30.481277875444164',
'114.40076076679632',
21,
0,
NOW(),
'TEST',
NOW(),
'TEST'
);
📋 技术要点
- 问题定位:手动插入成功说明表结构正确
- 批量vs单条:批量插入失败可能是某些特殊数据导致
- 错误处理:需要更robust的错误处理和数据验证
- 数据质量:需要确保源数据的质量和格式
结论
问题已精确定位:项圈设备数据中存在某些特殊格式的数据导致批量插入失败。虽然latitude数据本身没有问题,但问题可能在其他字段或数据库约束上。需要进一步深度检查所有字段和数据库约束。