Azure Synapse中ForEach SQL插入外文显示为???的问题求助
Azure Synapse插入MSSQL外文显示为"?????"的排查与解决
核心原因及修复方案
1. INSERT语句缺失Unicode前缀N
MSSQL里,未加N前缀的字符串常量会被默认解析为非Unicode(VARCHAR)类型,哪怕目标列是NVARCHAR,也会丢失Unicode字符。
- 错误示例:
INSERT INTO YourTable (ForeignTextCol) VALUES ('外文文本')
- 正确写法:
INSERT INTO YourTable (ForeignTextCol) VALUES (N'外文文本')
如果是在ForEach活动中用参数化查询,要确保参数被映射为Unicode类型;若用动态拼接SQL,必须给字符串值加上N前缀(优先用参数化,避免SQL注入)。
2. 数据库连接字符串未启用Unicode传输
检查Synapse中连接MSSQL的链接服务配置,确保连接字符串包含Unicode=True参数,强制连接以Unicode编码传输数据:
Server=tcp:yourserver.database.windows.net,1433;Initial Catalog=yourdb;Persist Security Info=False;User ID=youruser;Password=yourpass;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Unicode=True
3. ForEach活动中数据类型转换异常
Lookup输出正常不代表后续处理没问题,检查ForEach里的逻辑:
- 若用数据流活动,确认字符串列的类型是
String (UTF-8)或String (Unicode) - 若用自定义脚本,确保变量类型保留Unicode属性(Synapse默认字符串变量是Unicode,但自定义转换时别手动转成非Unicode类型)
4. 数据库/列的Collation不匹配
即使列是NVARCHAR,若Collation不支持目标外文(比如用了SQL_Latin1_General_CP1_CI_AS),也会导致显示乱码。
- 检查列的Collation:
SELECT name, collation_name FROM sys.columns WHERE object_id = OBJECT_ID('YourTable') AND name = 'ForeignTextCol'
- 修改为对应语言的Unicode Collation(比如阿拉伯语用
Arabic_CI_AS):
ALTER TABLE YourTable ALTER COLUMN ForeignTextCol NVARCHAR(255) COLLATE Arabic_CI_AS NOT NULL
快速排查步骤
- 直接用SSMS执行带
N前缀的INSERT语句,验证数据库本身能否正常存储外文 - 检查Synapse链接服务的连接字符串是否包含
Unicode=True - 开启Synapse调试模式,查看ForEach活动实际执行的INSERT语句,确认
N前缀是否存在 - 核对数据流中字符串列的类型配置
内容的提问来源于stack exchange,提问作者Waleed Alfaris
相关产品推荐
相关产品推荐

