1

我正在将管道分隔的 CSV 文件中的数据批量导入 SQL Server。数据格式如下

A|B|CCCCCC\r\n

通过在十六进制编辑器中查看 CSV 文件,我已经验证了文件是 UTF-8 格式,并且行以“\r\n”结尾。

命令是

BULK INSERT MyTable FROM 'C:\Path\File.csv'
WITH (FIRSTROW=1, MAXERRORS=0, BATCHSIZE=10000, FIELDTERMINATOR = '|', 
      ROWTERMINATOR = '\r\n')

第三列最初被定义为 CHAR(6),因为该字段始终是 6 个 (ASCII) 字符宽的代码。这导致批量插入期间出现截断错误。

然后我将列扩大到 CHAR(8)。导入有效,但是

SELECT CAST(Col3 As VARBINARY(MAX))

表示列数据以 0x0D0A 结尾(或“\r\n”,行终止符)

为什么行终止符包含在导入的数据中,我该如何解决?

4

1 回答 1

1

长话短说,SQL Server 不支持 UTF-8,您只需要\n作为行终止符。

实际上有点不清楚发生了什么,因为您没有提供表定义或精确的错误消息。说了这么多,我可以加载以下数据:

create table dbo.BCPTest (
    col1 nchar(1) not null,
    col2 nchar(1) not null,
    col3 nchar(6) not null
)

/* This data can saved as ASCII, UTF-16 with BOM or UTF-8 without BOM
   (see comments below)

A|B|CCCCCC
D|E|FFFFFF

*/

BULK INSERT dbo.BCPTest FROM 'c:\testfile.csv'
WITH (FIELDTERMINATOR = '|', ROWTERMINATOR = '\n')

注释:

  • 当我在记事本中创建并保存为“UTF-8”时,它添加了 BOM 字节 0xEFBBBF,这是标准的UTF-8 BOM
  • 但是,SQL Server不支持 UTF-8,它支持 UTF-16 (此处为官方文档)并且它期望BOM 为 0xFFFE
  • 所以我在记事本中再次将文件保存为“Unicode”,并添加了 0xFFFE BOM;如上所示,这加载得很好。出于好奇,我还将它(使用 Notepad++)保存为“没有 BOM 的 UTF-8”,我也可以加载该文件
  • 将文件另存为 ASCII 也可以使用相同的表数据类型和BULK INSERT命令很好地加载
  • \n行终止符不应该是\r\n因为\n解释为“换行符”,即 SQL Server(和/或 Windows)通过\n语义解释而不是字面解释而变得“聪明”。这很可能是C 处理\rand的结果\n,它不需要按字面意思解释它们。
于 2013-05-01T15:16:06.253 回答