如何恢复从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
相关产品推荐
相关产品推荐

