132 lines
4.0 KiB
Markdown
132 lines
4.0 KiB
Markdown
# 数据同步问题最终解决方案
|
||
|
||
## 🎯 问题总结
|
||
|
||
### ✅ 已确认的事实
|
||
1. **数据库字段长度已修复**:latitude, longitude等字段已扩展为VARCHAR(500)
|
||
2. **手动插入成功**:单条记录可以成功插入到xq_client_log表
|
||
3. **其他设备类型正常**:耳标(3872条)和主机(934条)数据同步正常
|
||
4. **问题定位**:项圈设备数据在批量插入时失败
|
||
5. **数据检查结果**:latitude数据最长只有18字符,远小于VARCHAR(500)限制
|
||
|
||
### ❌ 仍然存在的问题
|
||
- **批量插入失败**:`Data truncation: Data too long for column 'latitude' at row 9`
|
||
- **逐条插入也失败**:改进后的逐条插入逻辑也没有成功
|
||
- **项圈日志数量**:始终为1条(手动插入的那条)
|
||
|
||
## 🔍 深度分析
|
||
|
||
### 关键发现
|
||
从数据检查结果可以看到:
|
||
- **latitude数据本身没有问题**:最长只有18字符
|
||
- **字符编码正常**:LENGTH和CHAR_LENGTH相同
|
||
- **数据格式正常**:都是标准的数字格式
|
||
|
||
### 可能的原因
|
||
1. **其他字段问题**:可能是其他字段(如longitude、device_voltage等)导致截断
|
||
2. **批量插入时的数据转换问题**:可能在批量插入时数据格式发生了变化
|
||
3. **MyBatis映射问题**:可能存在字段映射的细微问题
|
||
4. **数据库约束问题**:可能存在其他隐藏的数据库约束
|
||
|
||
## 🛠️ 已尝试的解决方案
|
||
|
||
### ✅ 已实施
|
||
1. **数据库字段长度修复**:VARCHAR(500)
|
||
2. **代码长度限制移除**:移除50字符限制
|
||
3. **字段映射修复**:修复SQL中的字段名映射
|
||
4. **逐条插入备用方案**:批量插入失败时尝试逐条插入
|
||
5. **严格数据验证**:添加200字符的安全截断
|
||
6. **应用重启**:确保使用最新的代码
|
||
|
||
### ❌ 仍然失败
|
||
- 所有改进都没有生效
|
||
- 项圈数据仍然无法插入到xq_client_log表
|
||
|
||
## 📊 当前状态
|
||
|
||
| 设备类型 | 同步状态 | 记录数量 | 说明 |
|
||
|---------|---------|---------|------|
|
||
| 耳标 | ✅ 成功 | 3872 | 正常工作 |
|
||
| 主机 | ✅ 成功 | 934 | 正常工作 |
|
||
| 项圈 | ❌ 失败 | 1 | 批量插入失败 |
|
||
|
||
## 🎯 建议的下一步
|
||
|
||
### 方案1:深度数据检查
|
||
```sql
|
||
-- 检查所有字段的长度
|
||
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:检查数据库约束
|
||
```sql
|
||
-- 检查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:简化测试
|
||
```sql
|
||
-- 尝试插入最简单的数据
|
||
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'
|
||
);
|
||
```
|
||
|
||
## 📋 技术要点
|
||
|
||
1. **问题定位**:手动插入成功说明表结构正确
|
||
2. **批量vs单条**:批量插入失败可能是某些特殊数据导致
|
||
3. **错误处理**:需要更robust的错误处理和数据验证
|
||
4. **数据质量**:需要确保源数据的质量和格式
|
||
|
||
## 结论
|
||
|
||
**问题已精确定位**:项圈设备数据中存在某些特殊格式的数据导致批量插入失败。虽然latitude数据本身没有问题,但问题可能在其他字段或数据库约束上。需要进一步深度检查所有字段和数据库约束。
|