2010-07-26 8 views
2

J'ai des données utf8 que je voudrais insérer en masse (sql server 2005). J'utilise le CODEPAGE 65001:UTF8 problème SQL Server

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

cordes Unfortunatly comme ceci:

Erdagi

fin

par être stockés comme ceci:

Erda ??

Est-ce que j'utilise une mauvaise page de code? Y at-il autre chose que je puisse faire?

Merci.

Christian

+0

Comment êtes-vous certain que c'est * vraiment * un fichier UTF-8? Et comment regardez-vous les données stockées? Voir http://csharpindepth.com/Articles/General/DebuggingUnicode.aspx pour une approche générale à ce sujet. –

+0

Ceci est la source de données: http://www.world-gazetteer.com/wg.php?x=&men=stdl&lng=en&des=wg&srt=npan&col=abcdefghinoq&msz=1500 ils disent que c'est UTF 8 et je peux voir la bonne string in UniRed – cs0815

Répondre

3

Selon this link, "SQL Server ne prend pas en charge la page de code 65001 (encodage UTF-8)." Au début, je pensais que cela ne concernait que 2008, mais selon une réponse d'un rédacteur technique Microsoft à une question sur this link, "SQL Server n'a jamais pris en charge la page de code 65001 (codage UTF-8)."

+1

Intéressant et très décevant. J'ai d'abord obtenu la page de code d'un de ces sites - ils ont dû changer quelque chose. Êtes-vous au courant d'un travail autour? – cs0815

+0

Désolé, mais je ne suis pas au courant d'un travail autour. –

+0

Il semble aimer UCS-2 et vous pouvez traduire UTF8 en UCS-2. Est-ce que quelqu'un a fait cela avec succès? – cs0815

0

Vous pouvez utiliser C# pour gérer ce problème:

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); 
     } 
    } 
}