2010-07-26 119 views
2

我有一些utf8數據,我想批量插入(sql server 2005)。我使用的代碼頁65001:UTF8問題sql服務器

BULK INSERT #bla 
FROM 'D:\bla.txt' 
WITH 
( 
    CODEPAGE=65001, 
    FIELDTERMINATOR = '\t', 
    ROWTERMINATOR = '\n' 
) 

不幸的是字符串是這樣的:

Erdağı

最終被存儲這樣的:

而達?

我使用錯誤的代碼頁嗎?還有什麼我可以做的嗎?

謝謝。

基督教

+0

如何確定你是它的真正* *爲UTF-8的文件?你如何看待存儲的數據?請參閱http://csharpindepth.com/Articles/General/DebuggingUnicode.aspx,以獲取此方面的一般方法。 – 2010-07-26 16:52:53

+0

這是數據源:http://www.world-gazetteer.com/wg.php?x=&men=stdl&lng=en&des=wg&srt=npan&col=abcdefghinoq&msz=1500他們說這是UTF 8,我可以看到正確的字符串在UniRed – cs0815 2010-07-26 18:12:04

回答

3

this link, 「SQL Server不支持代碼頁65001(UTF-8編碼)。」起初,我認爲這隻涉及到2008年,但根據微軟技術作者對this link問題的迴應,「SQL Server從未支持代碼頁65001(UTF-8編碼)」。

+1

有趣和非常令人失望。我最初從其中一個站點獲得代碼頁 - 他們必須改變某些內容。你知道有解決辦法嗎? – cs0815 2010-07-26 19:02:20

+0

對不起,但我沒有意識到工作。 – 2010-07-26 19:03:26

+0

它似乎喜歡UCS-2,並且可以將UTF8翻譯爲UCS-2。有沒有人成功做到這一點? – cs0815 2010-07-26 19:58:26

0

您可以使用C#來處理這個問題:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace UTF8toUCS2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (args.Length != 1) 
      { 
       Console.WriteLine("exampe: UTF8toUS2 [filepath]"); 
       return; 
      } 

      var filename = args[0]; 

      byte[] content = File.ReadAllBytes(filename); 

      byte[] newArray = new byte[content.Length + 3]; 

      newArray[0] = (byte)0xEF; 
      newArray[1] = (byte)0xBB; 
      newArray[2] = (byte)0xBF; 

      Array.Copy(content, 0, newArray, 3, content.Length); 

      byte[] utcs2Bytes = System.Text.Encoding.Convert(System.Text.Encoding.UTF8, System.Text.Encoding.Unicode, newArray); 

      File.WriteAllBytes(filename, utcs2Bytes); 
     } 
    } 
}