【问题标题】:Bulk insert of utf-8 vs utf-16 encoded data批量插入 utf-8 与 utf-16 编码数据
【发布时间】:2017-01-20 08:15:26
【问题描述】:

我的 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                             ""

可以看出第一列是空的。当我使用 BULK INSERT 将数据用作 utf-8 编码时,我的 BULK INSERT 是成功的。但是,由于 SQL Server 版本 12 不支持 utf-8 编码,因此我的数据中的特殊字符会发生变化。

为了保持原始数据,我将编码转换为 utf-16。但是,当我对相同的格式文件使用相同的 BULK INSERT 命令时,出现错误:

消息 4864,第 16 级,状态 1,第 1 行
第 2 行第 1 列 (sub_brand_id) 的批量加载数据转换错误(指定代码页的类型不匹配或无效字符)。

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

BULK INSERT <table> FROM <data_path>  
WITH (  
  FORMATFILE =   <Format_File_path>
  FIRSTROW = 2,
  LASTROW = 3
) 

附:我的数据确实有特殊字符,奇怪的中文和日文名称,葡萄牙语和西班牙语混合。为了保持数据不掺杂,我需要使用 utf-16。

谁能提供一个原因和解决方案?

【问题讨论】:

    标签: sql-server utf-8 bulkinsert utf-16


    【解决方案1】:

    头顶,几个建议:

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

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

    【讨论】:

    • 我已经尝试了以上两个建议。但这对他们俩都不起作用!!附言- 如果我的表的列数与我的数据文件的列数相同,并且我执行 BULK INSERT。然后就可以了。
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2019-02-02
    • 2012-06-30
    • 2015-12-06
    • 2012-06-24
    • 2014-01-18
    • 2013-09-01
    • 2012-03-13
    相关资源
    最近更新 更多