SSIS中DT_TEXT(代码页1254)转NVARCHAR:BQ到SQL Server特殊字符丢失问题
解决SSIS同步BigQuery到SQL Server时特殊字符丢失问题
核心原因
目标列varchar使用SQL_Latin1_General_CP1_CI_AS排序规则(对应ISO 8859-1编码),而İ、Ü、ü这类土耳其语字符不在该编码范围内。直接以ANSI方式插入(不带N前缀)会被替换为相近ASCII字符(如İ变为I),但通过Unicode(N前缀)插入时,SQL Server会自动完成字符映射以保留特殊字符。
可行解决方案
1. 用SSIS脚本组件转换为Unicode
如果无法通过数据转换组件直接将DT_Text转为DT_NTEXT,可通过脚本组件处理:
- 添加脚本组件作为转换节点,选中需要处理的
DT_Text输入列 - 在脚本编辑器中,将输入列类型映射为
.NET String(天然支持Unicode) - 定义一个
DT_WSTR或DT_NTEXT类型的输出列,在脚本中直接将输入列值赋值给输出列 - 将转换后的Unicode列连接到OLE DB目标组件
2. 配置OLE DB目标使用Unicode参数传递
强制SSIS以Unicode方式向目标表传递数据,等效于手动插入时的N'xxx':
- 打开OLE DB目标的高级编辑器,切换到「组件属性」选项卡
- 将
AccessMode设为SQL command,手动编写插入语句:INSERT INTO target_table(target_column) VALUES (?) - 切换到「输入列和输出列」选项卡,将输入列的参数类型映射为
DT_WSTR(而非DT_STR)
3. 强制BigQuery源用UTF-8编码读取
BigQuery数据默认以UTF-8存储,需确保SSIS源组件用正确编码读取:
- 打开BigQuery源组件编辑器,找到对应
DT_Text列的属性 - 将
CodePage设置为65001(UTF-8对应的代码页编号),避免转码时丢失特殊字符
4. 临时调整目标列排序规则(可选)
若允许临时修改目标表,可先切换到支持土耳其语的排序规则:
ALTER TABLE target_table ALTER COLUMN target_column VARCHAR(xxx) COLLATE SQL_Turkish_CI_AS;
同步完成后再改回原排序规则(注意:改回前需测试,避免不兼容字符丢失)
内容的提问来源于stack exchange,提问作者trstrstrs
相关产品推荐
相关产品推荐

