如何在SQL Server中使用批量插入编写UTF-8字符?

Gor*_*vic 20 sql-server bulkinsert utf-8 sql-server-2008-r2

我正在对sqlserver进行BULK INSERT,并且没有正确地将UTF-8字符插入数据库.数据文件包含这些字符,但在批量插入执行后数据库行包含垃圾字符.

我的第一个疑问是格式文件的最后一行:

10.0
3
1 SQLCHAR  0  0  "{|}"  1 INSTANCEID ""
2 SQLCHAR  0  0  "{|}"  2 PROPERTYID ""
3 SQLCHAR  0  0  "[|]"  3 CONTENTTEXT "SQL_Latin1_General_CP1_CI_AS"
Run Code Online (Sandbox Code Playgroud)

但是,在阅读这个官方页面后,在我看来,这实际上是SQL Server 2008版中的插入操作读取数据文件时的一个错误.我们使用的是版本2008 R2.

这个问题的解决方案是什么,或者至少是一种解决方法?

小智 37

我在寻找批量插入特殊字符的解决方案之前来到这里.不喜欢UTF-16的解决方法(这将使csv文件的大小加倍).我发现你绝对可以,而且非常简单,你不需要格式文件.因此,我正在为其他正在寻找相同内容的人添加此评论,因为它似乎没有在任何地方记录得很好,我相信这对非英语国家的人来说是一个非常普遍的问题.解决方案是:只需在批量插入的with语句中添加CODEPAGE ='65001'.(65001 = UTF-8的代码页编号).可能不适合迈克尔奥建议的所有unicode角色,但至少它适用于拉丁语,希腊语和西里尔语,可能还有很多其他人.

注意:MSDN文档说不支持utf-8,不相信它,对我来说这在SQL Server 2008中运行得很完美,但是没有尝试其他版本.

例如:

BULK INSERT #myTempTable 
FROM  'D:\somefolder\myCSV.txt'+
WITH 
    ( 
        CODEPAGE = '65001',
        FIELDTERMINATOR = '|',
        ROWTERMINATOR ='\n'
    );
Run Code Online (Sandbox Code Playgroud)

如果所有特殊字符都在160-255(iso-8859-1或windows-1252)中,您还可以使用:

BULK INSERT #myTempTable 
FROM  'D:\somefolder\myCSV.txt'+
WITH 
    ( 
        CODEPAGE = 'ACP',
        FIELDTERMINATOR = '|',
        ROWTERMINATOR ='\n'
    );
Run Code Online (Sandbox Code Playgroud)

  • 使用SQL Server 2014时,在尝试使用代码页65001的批量插入时出现错误:"服务器不支持代码页65001." 无论哪种方式,我需要导入的数据都是阿拉伯语,所以无论如何我都没想到它会起作用. (6认同)

Mic*_*l-O 28

你不能.您应该首先使用N类型数据字段,将文件转换为UTF-16然后导入它.该数据库不支持UTF-8.

  • SQL2016和SQL2014 SP2支持代码页65001(UTF-8编码)(在其他答案中也有提及,但它们在页面下方可能会被遗漏) (4认同)
  • 去年在使用SQL Server 2008和Analysis Services设置数据仓库时遇到了一些严重的麻烦.我想通过批量插入将巨大的CSV文件插入到数据库中,经过几个小时的尝试,我意识到数据库只知道[Unicode BMP](http://msdn.microsoft.com/en-us/library/ms186939% 28v = SQL.100%29.aspx)这是UTF-16的子集.所以我的整个文件必须首先用Unix中的`iconv`进行重新编码,然后导入顺利进行.参见[here](http://msdn.microsoft.com/en-us/library/ms188365.aspx)arguments => CODEPAGE,code_page和DATAFILETYPE,widenative (2认同)

小智 8

  1. 在excel中保存文件为CSV(逗号分隔)
  2. 在记事本++中打开保存的CSV文件
  3. 编码 - >转换为UCS-2 Big Endian
  4. 保存

BULK INSERT #tmpData

    FROM 'C:\Book2.csv'
    WITH
    (
        FIRSTROW = 2,
        FIELDTERMINATOR = ';',  --CSV field delimiter
        ROWTERMINATOR = '\n',   --Use to shift the control to next row
        TABLOCK
    )
Run Code Online (Sandbox Code Playgroud)

完成.


小智 5

Microsoft刚刚向SQL Server 2014 SP2添加了UTF-8支持:

https://support.microsoft.com/zh-CN/kb/3136780