iotsaas/backend/sql/V26__fix_mojibake_chinese.sql
2995840376 066d374673 fix(M): 修复品类中文乱码, 子设备在线状态按父网关判定
乱码: 服务器 mysql 客户端在 C locale 下 character_set_client=latin1, 迁移脚本经 Windows type|plink 管道执行时 UTF-8 字节被按 latin1 解读, 中文双重编码。修复: V25/V26 脚本首行加 SET NAMES utf8mb4, deploy-all.bat 的 mysql 调用补 --default-character-set=utf8mb4, 新增 V26 按 code 写回正确中文(幂等)。已验证 product_category.name 的 hex 为正确 UTF-8。

子设备在线: 涂鸦 Mesh/Zigbee 子设备无独立在线通道, SDK 与云端快照对其 online 恒 false, APP 上报后被写成离线。后端新增 resolveEffectiveOnlineStatus —— 上报在线即 online; 子设备上报离线时以父网关为准(父在线则 online); 设备列表输出再做一次父网关聚合, 历史数据立即生效。前端 DeviceInfo 增报 parentDeviceId, 并按品类推断 is_gateway。

APP: 网关下挂设备不再用涂鸦 SDK 快照覆盖后端结论; 列表状态改为在线/离线/状态未知三态; uniapp 端修复状态比大写 ONLINE 导致恒离线、且把状态字符串当 DP JSON 解析的问题。生产验证: JD2BTSA/JD6BTSA 由 offline 变为 online。
2026-10-28 01:25:46 +08:00

33 lines
2.4 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =====================================================================
-- V26 · 修复品类字典中文乱码(双重编码)
-- ---------------------------------------------------------------------
-- 现象:后台「品类管理」品类名称显示为 "煉明" 之类乱码。
--
-- 成因:服务器 mysql 客户端运行在 C locale,character_set_client 默认 latin1
-- (容器内 `SELECT @@character_set_client` → latin1)。
-- 迁移脚本经 Windows `type | plink` 管道喂给客户端时,UTF-8 字节被当作
-- latin1 字符接收,再按 utf8mb4 列存储 → 中文变成双重编码。
-- (历史数据如 product.name 中文正常,是因为当时用 docker cp 进容器再执行,
-- 没走管道。)
--
-- 处理:
-- 1) 本脚本首行 SET NAMES utf8mb4,保证脚本里的中文字面量按 utf8mb4 解释;
-- 2) 直接按 code 写回正确的中文名称与备注(幂等:仅在值不一致时才更新);
-- 3) 后续所有含中文的迁移脚本都需在首行加 SET NAMES utf8mb4,
-- deploy-all.bat 也已为 mysql 客户端补 --default-character-set=utf8mb4。
--
-- 无存储过程、无 DELIMITER;幂等可重复执行。
-- =====================================================================
SET NAMES utf8mb4;
UPDATE product_category SET name = '照明', remark = '灯/灯泡/灯带', update_time = NOW() WHERE deleted = 0 AND code = 'light';
UPDATE product_category SET name = '开关/插座', remark = '开关/插座/墙面面板', update_time = NOW() WHERE deleted = 0 AND code = 'switch';
UPDATE product_category SET name = '空调/暖通', remark = '空调/风扇/取暖器', update_time = NOW() WHERE deleted = 0 AND code = 'ac';
UPDATE product_category SET name = '窗帘', remark = '窗帘/遮阳', update_time = NOW() WHERE deleted = 0 AND code = 'curtain';
UPDATE product_category SET name = '传感器', remark = '温湿度/人体/门磁', update_time = NOW() WHERE deleted = 0 AND code = 'sensor';
UPDATE product_category SET name = '门锁', remark = '智能门锁', update_time = NOW() WHERE deleted = 0 AND code = 'lock';
UPDATE product_category SET name = '安防', remark = '报警器/摄像头', update_time = NOW() WHERE deleted = 0 AND code = 'security';
UPDATE product_category SET name = '其它', remark = '未归类', update_time = NOW() WHERE deleted = 0 AND code = 'other';