使用BULK INSERT未正确导入重音字符

时间:2012-12-19 10:06:48

标签: sql-server-2008 csv character-encoding bulkinsert

我正在导入源CSV文件,我不知道源编码,我只能看到�(ANSI编码)或(UTF8-without-BOM编码)使用Notepad++related question)打开文件。

此文件已使用mssql-2008导入数据库bulk insert

DECLARE @bulkinsert NVARCHAR(2000)              
  SET @bulkinsert =               
 N'BULK INSERT #TempData FROM ''' +               
@FilePath +               
N''' WITH (FIRSTROW = 2,FIELDTERMINATOR = ''","'',ROWTERMINATOR =''\n'')'              
     EXEC sp_executesql @bulkinsert 

然后将其从第1列(table1)中的#tempData复制到常规varchar()。现在,当我调查这个table1时,我会看到一些?代替这些角色。

我尝试castnvarchar(),但没有帮助。

当我在支持我们同时下载的链接的情况下深入研究这些角色的真实情况时,我看到角色是éäå等等。

我会使用replace来修复数据,但我需要制作一些丑陋的代码并查看单个单词模式并替换,所以看起来很难。

数据库/表格整理:SQL_Latin1_General_CP1_CI_AS 列1(VARCHAR(80))

我可以将这些字符更改为英文字符或原始字符而不是?标记。

我看了Collation and Unicode Support这对我没有帮助。我理解它对编码有什么意义,但没有为我提供what to do。我已经查看了stackoverflow中的大多数帖子,是的,有一些关于它的帖子,但与我的搜索不符。

我无法弄清问题所在。

4 个答案:

答案 0 :(得分:4)

在我的情况下,我可以使用CODEPAGE选项修复编码问题:

BULK
INSERT #CSV
FROM 'D:\XY\xy.csv'
WITH
(
   CODEPAGE = 'ACP',
   DATAFILETYPE ='char',
   FIELDTERMINATOR = ',',
   ROWTERMINATOR = '\n',
   FIRSTROW = 2
)

可能的值: CODEPAGE = {' ACP' | ' OEM' | ' RAW' | ' code_page' }]

您可以在此处找到有关该选项的更多信息: BULK INSERT

答案 1 :(得分:3)

评论中回答了这个问题。你试过吗?

http://msdn.microsoft.com/en-us/library/ms189941.aspx

选项DATAFILETYPE ='widenative'

根据Esailiga的评论,文本在批量导入之前或之后被截断。我同意这听起来像CSV文件本身就是单字节。 Unicode需要选项DATAFILETYPE ='widenative'。如果CSV文件是单字节,则不是魔术翻译。

é是扩展的ASCII并且受SQL char支持,所以太糟糕了,因此更多证据表明问题出在CSV上 SELECT CAST('é'ASchar(1))
请注意这是扩展ASCII(< 255)

听起来你需要回到源头。

?在SQL中是未知的。与记事本中的Same相同。

答案 2 :(得分:1)

我仍然无法相信,经过这么多年,微软还没有解决这个明显的错误。 èéêë等应该没有问题,因为它们都是ascii(< 255)。这个任务在很多网站上一遍又一遍地提出,问题尚未得到解答

我的数据位于excel的表格中。已经生成了插入到语句中的表,第二次解析表寻找asccii> 'z'并生成和更新表集列语句以覆盖导入的数据。繁琐但可行的

答案 3 :(得分:1)

我已经完成了!经过这么多年,我们都在寻找错误的地方。没有工作不需要重写脚本...

问题在于SSMS ......如果你"新查询"通过右键单击"查询"你可以重命名文件,但不能创建为你完成的文件......

但是......如果你" Ctrl + N"你得到一个新的查询窗口进行编辑但没有创建文件...所以你自己保存并在保存按钮上选择编码...在列表底部你会找到UTF-8(没有签名)代码页65001

就是这样......

脚本在脚本打开一个新的查询窗口后用" ctrl + N"从现有查询中复制并粘贴,并按上述指示保存。而且好像通过魔法一起工作

如果像我这样你在Excel中有表...解析表将输出写入新工作簿的第1列,其中包含1张表,然后保存并选择utf-8编码

使用包含评论的模板文件加快速度" - utf-8"类似的东西。将其保存为utf-8并使用粘贴到excel中的* .sql文件列表来连接列表 = concatenate(" ren templatefile.txt",char(34),a1,char(34)) 在b1中放下它

经过这么多年的手动解决方案后,我对这一发现充满了兴奋。谢谢你让我这么难过