使用BCP插入带有Unicode字符的行

mtm*_*ald 4 sql-server unicode bulkinsert bcp azure-sql-database

我正在使用BCP将数据从CSV文件批量上传到SQL Azure(因为不支持BULK INSERT).此命令运行并上载行:

bcp [resource].dbo.TableName in C:\data.csv -t "," -r "0x0a" -c -U bcpuser@resource -S tcp:resource.database.windows.net
Run Code Online (Sandbox Code Playgroud)

但data.csv是UTF8编码的,包含非ASCII字符串.这些被破坏了.我已经尝试将-c选项更改为-w:

bcp [resource].dbo.TableName in C:\data.csv -t "," -r "0x0a" -w -U bcpuser@resource -S tcp:resource.database.windows.net
Run Code Online (Sandbox Code Playgroud)

但后来我得到'0行复制'.

我做错了什么以及如何使用BCP批量插入Unicode字符?

Sol*_*zky 10

但data.csv是UTF8编码的

UTF-8编码是主要问题.使用-w无济于事,因为在Microsoft-land中,术语"Unicode"几乎总是指UTF-16 Little Endian.

解决方案将取决于您在最新版本(13.0/2016)中添加了哪个版本的BCP作为选项:

  • 如果您在SQL Server 2016(版本13.0)之前使用SQL Server附带的BCP,那么您需要将csv文件转换为UTF-16 Little Endian(LE),因为这是Windows/SQL Server/.NET对所有人使用的字符串.并使用-w开关.

    我在Notepad ++中将此文件编码为"UCS-2 LE BOM",而使用该-c开关的同一导入文件失败.

  • 如果您使用的是SQL Server 2016(版本13.0)或更新版本附带的BCP,则只需添加-c -C 65001到命令行即可.-C用于"代码页",65001是UTF-8的代码页.

bcp实用程序的MSDN页面状态(在-C交换机的说明中):

版本13之前的版本(SQL Server 2016)不支持代码页65001(UTF-8编码).以13开头的版本可以将UTF-8编码导入到早期版本的SQL Server.

UPDATE

通过SP2向SQL Server 2014添加了对UTF-8 /代码页65001的支持,如此Microsoft知识库文章中所述:

SQL Server 2014 SP2中的BCP实用程序和BULK INSERT Transact-SQL命令的UTF-8编码支持