首页 > 解决方案 > 由于代码页不正确,无法导入字符

问题描述

我有一个 SSIS 作业将数据从平面文件导入 SQL Server 表。我在源文件和目标表的编码方面遇到问题。该文件是一个 UTF8 编码的 CSV 文件,带有一些标准的重音拉丁字符(ãóé 等)。我的目标表被定义为具有 Latin1_General_CI_AS 排序规则,这意味着我可以毫无问题地手动插入以下文本:“JOÃO ANTÓNIO”。

当我声明平面文件源时,它会自动确定该文件具有 65001 代码页 (UTF-8),并为每一列推断字符串 [DT_STR]数据类型。但是,SSIS 包自动假定目标表具有 1252 代码页,给我以下错误:

Validation error. <STEPNAME>: <STEPNAME>: The code page 65002 specified on output column "<MYCOLUMN>" (180) is not valid. Select a different code page for output column "<MYCOLUMN>". 

我理解为什么,因为数据库排序规则被定义为具有该代码页。但是,如果我尝试将平面文件数据源设置为具有 Latin1 1252 编码,则 SSIS 会执行,但会错误地导入字符:

JOÃO ANTÓNIO(平面文件)-> JOAO ANTÓNIO(数据库)。

我已经尝试将平面文件源配置为兼容 unicode,但是当我将每列配置为具有兼容 unicode 的数据类型后,我无法更新目标步骤,因为 SSIS 直接从数据库推断数据类型并且不不要让我改变它们。

有没有办法将平面文件源保持为 CP 1252,但也可以导入正确的字符?我在这里想念什么?

标签: sql-serverssiscollationcodepages

解决方案


感谢 Larnu 的评论,我已经能够解决这个问题。

由于 SSIS 不允许隐式数据转换,我需要先设置一个数据转换步骤(派生列转换)。由于源列已经设置为 DTSTR[65002],我必须配置新的派生列形成一个表达式,从源代码页转换为目标代码页,使用以下表达式:

(DT_STR, 50, 1252)<SourceColumn>

在直接转换为 DT_STR 的情况下,说明该列的最大大小为 50 个字符,并且数据将使用 1252 代码页表示。


推荐阅读