Sql server utf-8与utf-16编码数据的批量插入

Sql server utf-8与utf-16编码数据的批量插入,sql-server,utf-8,bulkinsert,utf-16,Sql Server,Utf 8,Bulkinsert,Utf 16,我的SQL Server中有一个表,其中包含以下列 create table raw.sub_brand_channel_mapping ( ImportFileId int NULL, [sub_brand_id] int , [sub_brand_name] [nvarchar](1024) , [channel_country_id] int , [channel_id] int, [channel_name] [nvarchar](102

我的SQL Server中有一个表,其中包含以下列

create table raw.sub_brand_channel_mapping 
(
    ImportFileId int NULL,
    [sub_brand_id] int ,
    [sub_brand_name] [nvarchar](1024) ,
    [channel_country_id] int ,
    [channel_id] int,
    [channel_name] [nvarchar](1024) ,
    [status] [varchar](1024) ,
    [eff_start_date] date ,
    [eff_end_date] date
)
我正在尝试批量插入
.csv
文件。我的表有9列,而我的csv数据文件有8列。第一列“ImportFileId”应该稍后填充。为此,我使用的格式文件如下所示

10.0
8
1      SQLCHAR            0       1000       "|"     2    sub_brand_id                          ""
2      SQLCHAR            0       2000      "|"     3    sub_brand_name                        SQL_Latin1_General_CP1_CI_AS
3      SQLCHAR            0       2000       "|"     4    channel_country_id                    ""
4      SQLCHAR            0       2000      "|"     5    channel_id                            ""
5      SQLCHAR            0       2000      "|"     6    channel_name                          SQL_Latin1_General_CP1_CI_AS
6      SQLCHAR            0       2000       "|"     7    status                                SQL_Latin1_General_CP1_CI_AS
7      SQLCHAR            0       2000        "|"       8     eff_start_date                         ""
8      SQLCHAR            0       2000        "\r\n"     9       eff_end_date                             ""
可以看出,第一列为空。当我将数据作为utf-8编码使用大容量插入时,我的大容量插入成功。但是,由于SQL Server版本12不支持utf-8编码,因此数据中的特殊字符会发生变化

为了维护原始数据,我将编码转换为utf-16。但是,当我对相同格式的文件使用相同的大容量插入命令时,会出现一个错误:

Msg 4864,第16级,状态1,第1行
第2行第1列(子品牌id)的大容量加载数据转换错误(指定代码页的类型不匹配或无效字符)

我的批量插入查询如下所示:

BULK INSERT <table> FROM <data_path>  
WITH (  
  FORMATFILE =   <Format_File_path>
  FIRSTROW = 2,
  LASTROW = 3
) 
从中批量插入
与(
格式文件=
第一行=2,
最后一行=3
) 
另外,我的数据确实有特殊的字符,名字用奇怪的中文和日语,葡萄牙语和西班牙语混合。为了保持数据的完整性,我需要使用utf-16


有人能提供一个原因和解决方案吗?

下面是几点建议:

您可以将
datafiletype='widechar'
添加到
bulkinsert
语句的
WITH
子句中。但是,这可能很棘手,因为SQL Server的行为可能会因数据文件是否具有BOM表而有所不同。最好同时测试这两种情况


如果这没有帮助,我会尝试将格式文件中的列定义更改为
SQLNCHAR
(但对此不确定)。

在标题顶部,有几点建议:

您可以将
datafiletype='widechar'
添加到
bulkinsert
语句的
WITH
子句中。但是,这可能很棘手,因为SQL Server的行为可能会因数据文件是否具有BOM表而有所不同。最好同时测试这两种情况


如果这没有帮助,我会尝试将格式文件中的列定义更改为
SQLNCHAR
(但对此不确定)。

我已经尝试了上述两种建议。但这对他们两个都不起作用!!注意——如果我的表的列数与我的数据文件的列数相同,并且我进行了批量插入。我已经尝试了以上两种建议。但这对他们两个都不起作用!!注意——如果我的表的列数与我的数据文件的列数相同,并且我进行了批量插入。然后它就起作用了。