Files
medical-mall/docs/sql/fix_garbled.py

135 lines
6.2 KiB
Python
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.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
修复 complete_mall_database.sql 中的 UTF-8 替换字符乱码
原始文件中大量中文字符被替换为 \xef\xbf\xbd (U+FFFD)
"""
import os
import os
ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", ".."))
SRC = os.path.join(ROOT, "医疗-consumer", "mall_sql", "schemas", "complete_mall_database.sql")
DST = os.path.join(ROOT, "医疗-consumer", "mall_sql", "schemas", "complete_mall_database_fixed.sql")
DOC = os.path.join(ROOT, "医疗-consumer", "docs", "数据库对接文档.md")
# 读取原始文件bytes
with open(SRC, "rb") as f:
raw = f.read()
# 先把替换字符替换成一个临时标记,便于后续处理
marker = b"{{GARBLED}}"
raw = raw.replace(b"\xef\xbf\xbd", marker)
# 解码为字符串(此时已无替换字符)
text = raw.decode("utf-8")
# 批量替换:根据上下文推断正确字符
replacements = [
# 模块标题 / 注释
("数据库设{{GARBLED}}", "数据库设计"),
("复用{{GARBLED}} ak_users", "复用主表 ak_users"),
("包含: 表结构、索引、触发器、RLS策略、视图、函{{GARBLED}}", "包含: 表结构、索引、触发器、RLS策略、视图、函数"),
("基础配置和扩{{GARBLED}}", "基础配置和扩展"),
("启用必要的扩{{GARBLED}}", "启用必要的扩展"),
("用户扩展{{GARBLED}}", "用户扩展表"),
("商城用户扩展信息{{GARBLED}}", "商城用户扩展信息表"),
("营业执照{{GARBLED}}", "营业执照号"),
("认证状{{GARBLED}}", "认证状态"),
("未认{{GARBLED}}", "未认证"),
("已认{{GARBLED}}", "已认证"),
("用户地址{{GARBLED}}", "用户地址表"),
("商品管理{{GARBLED}}", "商品管理模块"),
("商品分类{{GARBLED}}", "商品分类表"),
("品牌{{GARBLED}}", "品牌表"),
("商品{{GARBLED}}", "商品表"),
("基础属{{GARBLED}}", "基础属性"),
("{{GARBLED}}", "状态"),
("商品SKU{{GARBLED}}", "商品SKU表"),
("商品规格{{GARBLED}}", "商品规格表"),
("规格值数{{GARBLED}}", "规格值数组"),
("店铺管理{{GARBLED}}", "店铺管理模块"),
("店铺信息{{GARBLED}}", "店铺信息表"),
("订单管理{{GARBLED}}", "订单管理模块"),
("订单{{GARBLED}}", "订单表"),
("总金{{GARBLED}}", "总金额"),
("状态信{{GARBLED}}", "状态信息"),
("待付{{GARBLED}}", "待付款"),
("待发{{GARBLED}}", "待发货"),
("待收{{GARBLED}}", "待收货"),
("已完{{GARBLED}}", "已完成"),
("已取{{GARBLED}}", "已取消"),
("退款中 7:已退{{GARBLED}}", "退款中 7:已退款"),
("订单商品{{GARBLED}}", "订单商品表"),
("营销管理{{GARBLED}}", "营销管理模块"),
("NULL表示平台{{GARBLED}}", "NULL表示平台券"),
("满减{{GARBLED}}", "满减券"),
("折扣{{GARBLED}}", "折扣券"),
("百分{{GARBLED}}", "百分比"),
("优惠{{GARBLED}}", "优惠值"),
("最低订单金{{GARBLED}}", "最低订单金额"),
("最大优惠金{{GARBLED}}", "最大优惠金额"),
("总发放数{{GARBLED}}", "总发放数量"),
("每用户限领数{{GARBLED}}", "每用户限领数量"),
("使用次数限{{GARBLED}}", "使用次数限制"),
("已结{{GARBLED}}", "已结束"),
("未使{{GARBLED}}", "未使用"),
("已使{{GARBLED}}", "已使用"),
("已过{{GARBLED}}", "已过期"),
("配送员信息{{GARBLED}}", "配送员信息表"),
("电动{{GARBLED}}", "电动车"),
("摩托{{GARBLED}}", "摩托车"),
("配送距{{GARBLED}}", "配送距离"),
("预计配送时{{GARBLED}}", "预计配送时间"),
("取货{{GARBLED}}", "取货码"),
("评价管理{{GARBLED}}", "评价管理模块"),
("商品评价{{GARBLED}}", "商品评价表"),
("已删{{GARBLED}}", "已删除"),
("已隐{{GARBLED}}", "已隐藏"),
("用户行为{{GARBLED}}", "用户行为模块"),
("用户收藏{{GARBLED}}", "用户收藏表"),
("用户浏览历史{{GARBLED}}", "用户浏览历史表"),
("浏览时长({{GARBLED}}", "浏览时长(秒)"),
("搜索记录{{GARBLED}}", "搜索记录表"),
("系统配置{{GARBLED}}", "系统配置表"),
("地区{{GARBLED}}", "地区表"),
("用户扩展表索{{GARBLED}}", "用户扩展表索引"),
("地址表索{{GARBLED}}", "地址表索引"),
("商品表索{{GARBLED}}", "商品表索引"),
("SKU表索{{GARBLED}}", "SKU表索引"),
("订单表索{{GARBLED}}", "订单表索引"),
("订单商品表索{{GARBLED}}", "订单商品表索引"),
("收藏表索{{GARBLED}}", "收藏表索引"),
("触发器函{{GARBLED}}", "触发器函数"),
("自动更新 updated_at 字段的函{{GARBLED}}", "自动更新 updated_at 字段的函数"),
("为需要的表创{{GARBLED}}updated_at 触发{{GARBLED}}", "为需要的表创建 updated_at 触发器"),
("商品库存更新触发{{GARBLED}}", "商品库存更新触发器"),
("更新商品总库{{GARBLED}}", "更新商品总库存"),
("订单状态变更时的处{{GARBLED}}", "订单状态变更时的处理"),
("更新商品销{{GARBLED}}", "更新商品销量"),
("生成优惠券码的函{{GARBLED}}", "生成优惠券码的函数"),
("计算购物车总金{{GARBLED}}", "计算购物车总金额"),
("获取商品总库{{GARBLED}}", "获取商品总库存"),
("自己的数{{GARBLED}}", "自己的数据"),
("初始化数{{GARBLED}}", "初始化数据"),
("优惠券设{{GARBLED}}", "优惠券设置"),
("已创建索{{GARBLED}} 30+ 个索{{GARBLED}}", "已创建索引 30+ 个索引"),
("已创建函{{GARBLED}} 10+ 个函{{GARBLED}}", "已创建函数 10+ 个函数"),
("已创建视{{GARBLED}} 3 个视{{GARBLED}}", "已创建视图 3 个视图"),
]
for old, new in replacements:
text = text.replace(old, new)
# 写入修复后的文件
with open(DST, "w", encoding="utf-8") as f:
f.write(text)
# 检查是否还有残留
remaining = text.count("{{GARBLED}}")
print(f"修复完成,残留乱码标记: {remaining}")
if remaining > 0:
for i, line in enumerate(text.splitlines(), 1):
if "{{GARBLED}}" in line:
print(f" Line {i}: {line.strip()[:120]}")