如何将 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?的主要内容,如果未能解决你的问题,请参考以下文章