【问题标题】:Bulk Import Unicode with SQL Server 2016使用 SQL Server 2016 批量导入 Unicode
【发布时间】:2017-12-11 10:19:05
【问题描述】:

由于我们已迁移到 SQL Server 2016,我们现在尝试使用非 XML 格式文件和 UTF-8 编码数据文件(使用换行符 Unix (LF))通过 BULK IMPORT 将 Unicode 字符导入表中。格式文件指定主机文件数据长度,但不指定终止符。主机文件数据类型是 SQLCHAR。我的 BULK INSERT 语句如下所示:

SET @cmd = N'Bulk Insert  myTable from ''D:\DATA\datafile'' with (DATAFILETYPE =''widechar'', KEEPNULLS, FORMATFILE = ''D:\DATA\fmt\formatfile.ftm'' ,MAXERRORS = 0, codepage=65001, FIRSTROW = 1)'

EXECUTE (@cmd)

格式化文件:

    9.0
    7
    1       SQLCHAR       0       8       ""   1     column_1 ""
    2       SQLCHAR       0       8       ""   2     column_2 ""
    3       SQLCHAR       0       12       ""   3     column_3 ""
    4       SQLCHAR       0       8       ""   4     column_4 ""
    5       SQLCHAR       0       12       ""   5     column_5 ""
    6       SQLCHAR       0       40       ""   6     column_6 ""
    7       SQLCHAR       0       8       ";\n"   7     column_7 ""

表定义:

CREATE TABLE #myTable 
(  [column_1] [nvarchar](8) NOT NULL,
    [column_2] [nvarchar](8) NULL,
    [column_3] [nvarchar](12) NULL,
    [column_4] [nvarchar](8) NOT NULL,
    [column_5] [nvarchar](12) NULL,
    [column_6] [nvarchar](40) NULL,
    [column_7] [datetime] NULL)

BULK INSERT 可以轻松导入普通字符(如 A、B、C...)。但是当涉及到 Ä 或 Ü 之类的字符时,BULK INSERT 似乎将这些字符一分为二,因此文件数据长度增加了 1(如果字符串仅包含一个字符,例如 Ä)。字符串中的最后一个字符将作为第一个字符插入到下一个表列中。知道如何解决这个问题吗?由于数据文件来自第三方,我无法影响这些文件的创建/操作。

P.S.:顺便说一句,BCP 工具也是如此。

感谢任何帮助!

谢谢!

【问题讨论】:

  • 执行的实际语句是什么?为什么要显示串联的行?
  • 能否在您的问题中包含格式文件?
  • 对于字符长度,Ä UTF8 中需要两个字节。您可能对列使用了 NON-UTF8 编码和固定长度,这意味着 SQL Server 计算 bytes 而不是字符 - 因为它应该
  • SQLCHAR 表示 ASCII
  • 根据this support article,似乎在 2014 SP2 中添加了对 Bulk Insert 的 UTF8 支持。代码页设置为WITH (CODEPAGE = '65001', DATAFILETYPE = 'Char')

标签: sql-server unicode bulkinsert


【解决方案1】:

解决了!我的步骤: - 将数据文件转换为 Unicode - 在批量插入语句中设置 CodePage = 65001 和 Datafiletype = 'widechar' - 在非 XML 格式文件中,将主机文件数据类型设置为 SQLNCHAR(感谢 Panagiotis - s. cmets 提出的问题)并复制了主机文件数据长度。

【讨论】:

    【解决方案2】:

    我没有转换我的 UTF-8 编码的 txt。就用这个吧:

    --bulk insert
    BULK INSERT dbo.tablename
    FROM 'C:\Users\user\Desktop\myfile.txt'
    WITH (
    FirstRow = 2, --(if skipping a header row)
    FIELDTERMINATOR = '|',
    ROWTERMINATOR   = '\n',
    CODEPAGE = '65001', 
    DATAFILETYPE = 'Char')
    

    【讨论】:

      猜你喜欢
      • 2018-08-02
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 2011-06-17
      相关资源
      最近更新 更多