SSIS:代码页返回到 65001

SSIS: Code page goes back to 65001

在我正在编写的 SSIS 包中,我有一个 CSV 文件作为源。在连接管理器常规页面上,它有 65001 作为代码页面(我正在测试一些东西)。未检查 Unicode。

列映射到 SQL 服务器目标 table,其中包含 varchar(以及其他)列。

There's an error at the destination: The column "columnname" cannot be processed because more than one code page (65001 and 1252) are specified for it.

我的 SQL 列必须是 varchar,而不是 nvarchar,因为其他应用程序使用它。

然后,在连接管理器常规页面上,我将代码页更改为 1252 (ANSI - Latin I) 并确定,但是当我再次打开它时,它又回到了 65001。如果(只是为了测试)我是否检查 Unicode 并没有什么区别。

请注意,所有这一切都是在 CSV 文件和 SQL table 添加和删除列(用户,你知道的)之后开始发生的。在此之前,我没有任何问题。是的,我在高级编辑器中刷新了 OLE DB 目标。

这是 SQL Server 2012 以及随附的 BIDS 和 SSIS 版本。

65001 Code page = Unicode (UTF-8)

基于此Microsoft article (Flat File Connection Manager)

Code page
Specify the code page for non-Unicode text.

还有

You can configure the Flat File connection manager in the following ways:

Specify the file, locale, and code page to use. The locale is used to interpret locale-sensitive data such as dates, and the code page is used to convert string data to Unicode.

因此当平面文件具有 Unicode 编码时:

  • Unicode, UTF-8, UTF-16, UTF-32

那么这个属性就不能改了,总是return到原来的编码。

有关代码页标识符的更多信息,您可以参考这篇文章:

如果它是 CSV 文件列文本流 [DT_TEXT] 到 SQL varchar(max) 要转换为的数据类型,请更改平面文件连接管理器编辑器 属性 代码页为 1252(ANSI - Latin I)。

如果是csv文件,您仍然可以使用代码页1252来处理它。当您打开平面文件连接管理器时,它会向您显示该文件的代码页,但您不需要保存该设置。如果您要在连接管理器中进行其他更改,请在保存更改之前将代码页改回 1252。如果文件中没有 unicode 字符,它会正常处理。

我通过派生列转换在 SSIS 中解决了这个问题

我 运行 遇到了类似的挑战,这就是我最终在这个页面上寻找解决方案的原因。我用不同的方法解决了它。 我在 Notepad++ 中打开了 csv。菜单选项之一称为编码。如果您 select 那个,它将为您提供“转换为 ANSI”选项。 我知道我的文件不包含任何 Unicode 特定字符。 当我回到 SSIS 包时,我编辑了平面文件连接,它自动将其更改为 1252。

在我的例子中,文件是在 Excel 中生成的,并且(错误地)保存为 CSV UTF-8(逗号分隔)(*.csv) 而不是简单地CSV(逗号分隔)(*.csv)。一旦我将文件保存为正确的 CSV 格式,代码页不再从 1252 (ANSI - Latin I) 更改。