You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何恢复从Latin排序库转存的阿拉伯排序varchar列乱码旧数据?

阿拉伯文数据转存后变为问号的恢复方案

问题根源

Latin排序规则(如SQL_Latin1_General_CP850_CI_AS)的字符集不支持阿拉伯文编码,当阿拉伯文存入这类规则下的varchar列时,数据会被直接替换为问号存储。后续将这些问号数据转存到阿拉伯排序规则的varchar列时,存储的内容就是问号本身,而非可解码的阿拉伯文字节——这也是改nvarchar后新数据正常、旧数据仍为问号的核心原因。

恢复方法

1. 从源数据库重新同步(仅当源数据未损坏时可行)

若cust_supp表的acc_name_a列中仍能正常读取阿拉伯文,可通过以下步骤修复dcl_item_update表的旧数据:

  • 确认目标表dcl_item_update的old_value、new_value已改为nvarchar(510)类型
  • 执行关联更新语句(需根据实际业务逻辑调整关联字段):
UPDATE du
SET du.old_value = CAST(cs.acc_name_a AS NVARCHAR(510)),
    du.new_value = CAST(cs.acc_name_a AS NVARCHAR(510))
FROM dbo.dcl_item_update du
JOIN [源数据库名].dbo.cust_supp cs 
    ON du.dcl_record_key = cs.company_id -- 替换为实际关联字段
WHERE du.old_value LIKE '%?%' -- 仅更新已损坏的记录

2. 源数据已损坏的情况

若cust_supp表的acc_name_a列中阿拉伯文也已变为问号,说明数据在源库存储时就已丢失——varchar列无法保留阿拉伯文的编码信息,实际存储的就是问号,这种情况下无法恢复旧数据。

后续预防措施

  • 所有存储非Latin字符(如阿拉伯文)的列,统一使用nvarchar/nchar类型
  • 跨库同步时,显式将数据转换为Unicode类型(如CAST(column AS NVARCHAR(n)))
  • 数据库默认排序规则尽量与存储的字符类型匹配,减少无意义的编码转换

内容的提问来源于stack exchange,提问作者haneen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:51:16