如何将 UTF-8 平面文件导入 SQL Server 2008 R2?

Posted

技术标签:

【中文标题】如何将 UTF-8 平面文件导入 SQL Server 2008 R2?【英文标题】:How do you import UTF-8 flat files into SQL Server 2008 R2? 【发布时间】:2013-09-15 22:53:28 【问题描述】:

我有一堆 UTF-8 编码的平面文件需要导入 SQL Server 2008 R2 数据库。批量插入无法识别直径,似乎也无法接受 UTF-8。

我知道有很多关于 SQL Server 2008 如何处理 UTF-8 编码的文章,但我正在寻找任何更新的答案,因为这些文章大部分都是旧的。

我可以做些什么来将这些平面文件放入数据库中,方法是在插入之前转换它们还是在插入期间运行一个进程?

我不想手动转换每一个。此外,我尝试创建的 SSIS 包可以读取和分离数据。它只是无法移动看起来的数据。 :(

平面文件由 Java 生成。将 java 环境从 UTF-8 转换为任何其他编码均不成功。

注意

我无意存储 UTF-8 数据。我的分隔符很时髦,因为它是 UTF-8。分隔列和行时,SQL Server 无法读取字符。就是这样。

【问题讨论】:

您是否尝试使用 CodePage = 65001(UTF-8) 的 SSMS“导入数据”功能? 【参考方案1】:

不正确,您只需选择代码页 65001

【讨论】:

确保在编辑映射时选择 NVARCHAR。【参考方案2】:
    将您的数据文件转换为 UTF-16 Little Endian(即 Little Endian) 使用带有 -w 选项的 bcp。

【讨论】:

【参考方案3】:

仅供参考,如果有人谷歌它,并像我一样落在这里。

我已经尝试了十几次接受的答案,但没有成功。在我的例子中,我的数据文件是一个.csv 平面文件,其中有很多重音字符/字母,例如ç é ã á

我还注意到,无论我选择什么编码,导入都是使用 1251 (ANSI - Latin 1) 编码进行的。

因此,解决方案是在导入之前转换,我的.csv 文件从 UTF-8 转换为完全相同的 1251(ANSI - 拉丁语 1)编码。我使用 Notepad++ 进行了转换。

转换后,进行常规导入(通过 SSMS 任务 ->“导入数据”向导),选择 1251(ANSI - 拉丁语 1)编码,一切都正确导入。

环境:

SQL Server 网络 2016

SQL Server Management Studio v17.9.1

记事本++ v7.7.1

另外,这也回答了原始 OP 的问题:

我可以做些什么来将这些平面文件放入数据库中,方法是在插入之前转换它们还是在插入期间运行一个进程?

【讨论】:

【参考方案4】:

因为起初它不起作用,所以我想补充 Arthur 的答案,正如 live-love 在 cmets 中提到的那样: 您应该将字符串数据类型更改为 NVARCHAR。 您可以通过从“高级”选项卡和指定的列中选择 Unicode 字符串 (DT_WSTR) 来做到这一点。

【讨论】:

【参考方案5】:

Microsoft 在编码方面一直很糟糕,尤其是在 SQL Server 中。 Here 是您的解决方案。

【讨论】:

是否有一种解决方案可以同时对所有文件执行此操作?也许某些东西与 SQL Server 无关?我对存储 UTF-8 字符没有兴趣。只是我的分隔符是 UTF-8,因此它不能分隔列或行。 分隔符怎么可能是字符编码?也许我错过了一些东西。我已经在我提到的答案的 cmets 中列出了您可以使用 iconv 或直接用 Java 编写 UTF-16 文件,只需将编码提供给您的 PrintWriter 我尝试在 Java 中设置环境以使用 UTF-8 以外的其他方式编写,同时传递环境设置并在 Maven 中定义它。我什至在 Windows(这是我用于 Java 的环境)中设置了环境变量,以将相同的环境设置传递给 Java。都失败了。至于 Unix,如果 iconv 限制为 *inx,我无法访问 Linux 或 Unix 环境进行转换。 昨晚我确实做了一个 SSIS 包,我将源文件设置为 UTF-8。包可以读取数据,但分隔符是垃圾。所以我将分隔符定义为 SQL 处理的垃圾字符。它将列分开,所有其他数据(我正在导入的数据)都是干净的。我使用 SSIS 包将其直接导入数据库,没有任何问题。如果我尝试使用 SSIS 将数据从 UTF-8 转换为其他任何内容,则会出错。

以上是关于如何将 UTF-8 平面文件导入 SQL Server 2008 R2?的主要内容,如果未能解决你的问题,请参考以下文章

使用SSIS从SQL Server 2005中的平面文件导入时如何保留NULL值

使用导入和导出向导将平面文件导入 SQL Server

导入平面文件并创建报表 sql server

怎么将.txt文件导入到sql数据库中啊!

如何把csv文件导入到sql数据库

将固定宽度的 UTF-8 文件导入 SQL 2008R2,可变文件名