SSIS:代码页回到 65001

Posted

技术标签:

【中文标题】SSIS:代码页回到 65001【英文标题】:SSIS: Code page goes back to 65001 【发布时间】:2018-07-05 09:05:21 【问题描述】:

在我正在编写的 SSIS 包中,我有一个 CSV 文件作为源。在 Connection Manager General 页面上,它有 65001 作为代码页面(我正在测试一些东西)。未检查 Unicode。

这些列映射到带有 varchar(以及其他)列的 SQL Server 目标表。

目的地出错:无法处理列“columnname”,因为为其指定了多个代码页(65001 和 1252)。

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

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

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

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

【问题讨论】:

尝试删除并读取平面文件连接管理器 我想避免这种情况,并为数百列重新定义列的类型,然后将它们重新映射到 SQL 表。但我会试一试。 我没有为这个属性做过这个,但是我在其他地方做过这个。使用记事本打开 dtsx 并在其中编辑属性。 dtsx 或 commgr 文件中没有值为 65001 的属性。我从头开始,一个新的解决方案,但它仍然强制代码页为 65001。一定是数据中的某些东西。 平面文件代码页为 65001 = Unicode (UTF-8),您无法更改它,因为平面文件连接管理器中的代码页属性设计为 Specify the code page for non-Unicode text. 查看我的答案以获取更多详细信息. 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

我尝试了数据转换转换,虽然它允许我编辑每一列的代码页,但它从未保存更改。我查看了派生列转换,但这似乎是逐列操作,而不是批量操作。我的 sql 中有 56 列以 utf-8 编码的 csv 格式出现。 SSIS 是 Import Wizard 的主要回归,它只会自动进行转换,这太疯狂了。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

65001 代码页 = Unicode (UTF-8)

基于此Microsoft article (Flat File Connection Manager):

代码页 指定非 Unicode 文本的代码页。

还有

您可以通过以下方式配置平面文件连接管理器:

指定要使用的文件、语言环境和代码页。区域设置用于解释区域设置敏感数据,例如日期,代码页用于将字符串数据转换为 Unicode。

所以当平面文件有 Unicode 编码时:

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

那么这个属性就不能改变了,它会一直回到原来的编码。

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

Code Page Identifiers

【讨论】:

我不确定我是否遵循。这是否意味着 CSV 文件始终为 65001?或者这是否意味着它检测到该特定文件的数据中的某些内容将其强制为 65001?除了实际数据之外,CSV 文件中没有“标题”或任何配置数据。 无论如何,我所做的是将 CSV 文件导入到带有 nvarchars 的 SQL 表中,我将其用作临时表。然后我将数据复制到我的“真实”表中。 @Amarundo 我认为临时表是个好主意,您也可以使用script task 更改文件编码。您也可以使用Data Conversion Transformation 在 SSIS 中实现此目的。但我认为您的选择 (staging table) 是最简单的方法。 谢谢。我从来没有注意到这一点!无论如何,这个 CSV 是由另一个系统生成的,这将被设置为调用 SSIS 包的 SQL 作业,所以我无法打开它并另存为。暂存台是我最安全的选择。不过,感谢您提供的信息。 没有。我坚持陈述表解决方案。谢谢!

以上是关于SSIS:代码页回到 65001的主要内容,如果未能解决你的问题,请参考以下文章

CMD的代码页被默认设置成了65001,每次运行都要输一次chcp936,如何永久修改呢?

DOS之chcp命令

LookupError: unknown encoding: cp65001

CMD代码页

windows设置控制台编码格式为UTF-8

Windows改动cmd字符集