none
Codierung von Text RRS feed

  • Frage

  • Hallo,

    ich lese eine kleine ASCII-Datei über einen Bulk-Load mit einer gespeicherten Prozedur in ein Textfeld (nvarchar(max)) ein.

    Problem ist, dass der Text nach dem INSERT völlig verhunzt ist. Ursprünglich ist die Datei ANSI-codiert und enthält deutschen bzw. englischen Text mit Zahlen. In der Tabelle auf dem Server (SQLExpress 2014) landet es dann als Kauderwelsch chinesischer Schriftzeichen.

    Lade ich die Datei von Platte in einen Texteditor (Notepad++), dann sieht alles ganz normal aus. Notepad++ sagt als Codierung ANSI und alles ist für mich lesbar. 

    Es ist so, dass wenn ich die Datei "ziehe", also der Server selbst die Datei von einer lokalen Platte lädt, dass dann die Codierung durcheinander gerät. Wenn ich die Datei drücke, das heißt, ein Client lädt die Datei als Ganzes über eine Netzlaufwerkverbindung in eine Textvariable und schiebt dann von dort über ein INSERT INTO die Datei in die Tabelle, ist die Codierung nicht verändert, die Daten sind einwandfrei lesbar.

    Hat jemand einen Tipp, an welcher Schraube ich drehen muss, dass beim Bulk-Load die Codierung des Textes nicht geändert wird?

    Gruß

    H.

    Mittwoch, 30. Mai 2018 13:11

Antworten

Alle Antworten

  • Beim Bulk-Insert kannst du die Codepage der Daten angeben. Ggf. wird durch das Zielfeld NVARCHAR hier automatisch UTF8 angenommen, daher das Chinesisch.

    Also Codepage kann 1252 (Deutsch) oder ACP (Active Codepage ANSI)  verwendet werden.

    Mittwoch, 30. Mai 2018 13:51
  • Welchen DATAFILETYPE hast Du angegeben?

    widenative Native (Datenbank-) Datentypen, außer in char-, varchar- und text-Spalten, in denen Date als Unicode gespeichert werden.Erstellen Sie die Datendatei widenative durch das Massenimportieren von Daten aus SQL Server mithilfe des Hilfsprogramms bcp.

    Der Wert vom Datentyp widenative bietet eine höhere Leistung als der widechar-Wert. Falls die Datendatei erweiterte ANSI-Zeichen enthält, geben Sie widenative an.


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Mittwoch, 30. Mai 2018 13:53
  • hat nix gebracht.

    INSERT INTO dbo.tblTest (Data) SELECT * FROM OPENROWSET( BULK 'C:\Data\test\Daten.dat',CODEPAGE=1252,SINGLE_BLOB) AS Data

    so richtig gewesen?


    Mittwoch, 30. Mai 2018 14:09
  • sorry, 

    nicht SINGLE_BLOB sondern SINGLE_CLOB

    und schon geht's!

    Wie war das mit dem Wald und den Bäumen?

    Mittwoch, 30. Mai 2018 14:26
  • Ggf. wird durch das Zielfeld NVARCHAR hier automatisch UTF8 angenommen


    Das ist schon mal gar nicht möglich, da der SQL Server kein UTF Encoding unterstützt, nur ANSI & Unicode.

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 31. Mai 2018 05:36
  • Dann habe ich mich wohl falsch ausgedrückt.

    NVARCHAR ist in der Speicherungsform ja Unicode, allerdings hat der Bulkinsert die Textdatei wohl ebenso als Unicode interpretiert. Dies kann dann wahlweise UCS2, UTF-16 oder eben auch UTF-8 sein.

    Was die Codierungen angeht so muss man UCS2/4 und UTF-8/16 unterscheiden.
    Fixe Codelänge: UCS2 = 2 (16-Bit), UCS4 = 4 Byte (32-Bit)
    Variable Codelänge UTF-8 = 1-4 Byte, UTF-16 = 2 oder 4 Byte.

    Oracle verwendet z.B. grundsätzlich nur UTF-8 als NVARCHAR.
    DB2 wahlweise UCS2 oder UCS4.

    Aber wie oben ja gesagt, hat durch die Definition als BLOB (Binary) der Import wohl UCS2 oder UTF16 angenommen.

    Donnerstag, 31. Mai 2018 10:09