BULK INSERT 后特殊字符显示不正确

Posted

技术标签:

【中文标题】BULK INSERT 后特殊字符显示不正确【英文标题】:Special characters displaying incorrectly after BULK INSERT 【发布时间】:2012-12-09 10:29:00 【问题描述】:

我正在使用 BULK INSERT 导入 CSV 文件。 CSV 文件中的一列包含一些包含分数的值(例如1m½f)。

我不需要对分数进行任何数学运算,因为这些值仅用于显示目的,因此我将列设置为nvarcharBULK INSERT 有效,但是当我查看 SQL 中的记录时,分数已被替换为分号 (¢),因此显示的文本为 1m¢f

我很想了解发生这种情况的原因以及有关如何解决此问题的任何想法。 BULK INSERT 命令是:

BULK INSERT dbo.temp FROM 'C:\Temp\file.csv' 
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' );

【问题讨论】:

数据是否真的包含二分之一字符? 是的,它包含 ½ 字符而不是 1/2。 @AaronBertrand,批量插入是:code BULK INSERT dbo.temp FROM 'C:\Temp\file.csv' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n') ;排序规则是 Latin1_General_CI_AS。如何检查文件是否标记为 Unicode?​​span> 您可以检查文件是否为 Unicode,例如,在记事本中打开文件,然后转到文件 > 另存为。根据 Windows 的版本,您应该会在某处看到“编码”下拉菜单,其中包含 ANSI、UTF-8、Unicode、Unicode 大端序等选项... @AaronBertrand,谢谢 - 它显示 ANSI。 【参考方案1】:

您需要使用CODEPAGE = 'ACP'BULK INSERT,它将字符串数据从 Windows 代码页 1252 转换为 SQL Server 代码页。

BULK INSERT dbo.temp FROM 'C:\Temp\file.csv' 
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', CODEPAGE = 'ACP');

如果您在足够新的 SQL Server 版本上引入 UTF-8 数据:

[...] , CODEPAGE = '65001');

您可能还需要指定DATAFILETYPE = 'char|native|widechar|widenative'

【讨论】:

这也是我正确批量插入带有重音字符(例如 è)的 ansii 文本所需要的。 谢谢@aaron bertrand。它部分地为我工作。我在插入重音字符时遇到问题。例如:ä 显示为 ä @user1417294 文件的编码是什么,列的数据类型和排序规则,数据库和实例的排序规则?

以上是关于BULK INSERT 后特殊字符显示不正确的主要内容,如果未能解决你的问题,请参考以下文章

重新加载后带有特殊字符的jqGrid过滤器问题

从OPENROWSET中选择(BULK ...)更改特殊字符

mysql数据库中的特殊字符

德语特殊字符 Ää、Öö、Üü、ß 在 LiveLink 或 opentext 中显示不正确

http请求特殊字符转码

使用 nodeFetch 在 JSON API 响应中正确显示特殊字符