sql-server - 由于代码页不正确,无法导入字符
问题描述
我有一个 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,但也可以导入正确的字符?我在这里想念什么?
解决方案
感谢 Larnu 的评论,我已经能够解决这个问题。
由于 SSIS 不允许隐式数据转换,我需要先设置一个数据转换步骤(派生列转换)。由于源列已经设置为 DTSTR[65002],我必须配置新的派生列形成一个表达式,从源代码页转换为目标代码页,使用以下表达式:
(DT_STR, 50, 1252)<SourceColumn>
在直接转换为 DT_STR 的情况下,说明该列的最大大小为 50 个字符,并且数据将使用 1252 代码页表示。
推荐阅读
- node.js - 使用另一种策略序列化时出现护照错误
- c# - 无法使用 C# 通过 .Net Core 调用 AWS API Gateway 资源/方法
- c - Dijkstra算法~
- android - Android Seekbar 多个刻度
- clion - 虚幻引擎告诉我要下载 Visual Studio,即使我想使用 CLion
- python - Django referrer 在模板中获取短域
- c# - C# BeginConnect 在同一个套接字上正在进行另一个异步操作时无法调用
- gitlab - 当我尝试将 kubectl 补丁部署到 Gitlab 时,Yaml 无效
- scala - 如何在 Spark Scala 中读取检查点数据框
- algorithm - 从 n 个组合尺寸的一组项目中创建所有可能组合的列表