UTF-8 文件 BULK INSERT with broken pipe field returns 错误

UTF-8 file BULK INSERT with broken pipe field returns error

我正在尝试加载带有损坏的竖线 (¦) 分隔符的 UTF-8 平面文件。

平面文件内容很简单,行以CRLF结尾

AAA¦BBB¦CCC

密码是

create table l_testfile
(COL1 nvarchar(255),
COL2 nvarchar(255),
COL3 nvarchar(255)
)


BULK INSERT l_testfile
FROM 'C:\testfile.txt'
WITH (CODEPAGE = '65001', DATAFILETYPE = 'Char', FIELDTERMINATOR = '¦')

这会导致错误

Msg 4832, Level 16, State 1, Line 16 Bulk load: An unexpected end of file was encountered in the data file. Msg 7399, Level 16, State 1, Line 16 The OLE DB provider "BULK" for linked server "(null)" reported an error. The provider did not give any information about the error. Msg 7330, Level 16, State 2, Line 16 Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".

当把破损的管道(¦)改成正常的管道(|)时,BULK INSERT 工作正常。加载带有破损管道的 ANSI 文件也不会出现任何错误。

我是不是漏掉了什么?

我无法访问 SQL 2016 实例我现在可以测试它,但我相信问题是由 ¦ 字符在 UTF 之间编码的不同方式引起的-8 和您的本地 varchar 代码页。

当您在 BULK INSERT 命令中指定 FIELDTERMINATOR 时,您将其指定为 varchar - 但大多数 single-byte 代码页中的 encoding of ¦0xA6,而在 UTF-8 中是 0xC2A6 - 结果,终止符永远不会匹配,这会导致错误(我不确定,但我怀疑这是因为 single-byte 值在内部转换为 UCS2-LE 表示 0x00A6).

我相信如果您使用 UTF-8 中构成 ¦ 的字节作为 FIELDTERMINATOR:

,批量插入应该可以正常工作
BULK INSERT l_testfile
FROM 'C:\testfile.txt'
WITH (CODEPAGE = '65001', DATAFILETYPE = 'Char', FIELDTERMINATOR = '0xC2A6')

(使用|作为分隔符是成功的,因为它被编码为