MSSQL - chińskie znaki w słowach z niemieckimi umlautami.

1

Witam.

Mam problem z bazami danych MSSQL. Moja aplikacja wczytuje dane z plików CSV do baz danych (PostgreSQL i MSSQL). Aplikacja napisana została w Python'ie. Poniżej znajdują się definicje 2 tabel i ich collation. Eksportuje wybrane dane z pierwszej do drugiej i u jednego z klientów po imporcie danych do bazy tam gdzie są niemieckie słowa z umlautami pojawiają się chińskie znaki jak na załączonym screenie. Dodam, że jak aplikacja eksportuje w dane w jedną i drugą stronę to w plikach CSV wszystko gra.

Domyslny Collation na bazie: Latin1_General_CI_AS

CREATE TABLE [dbo].[inv](
	[ITEMID] [nvarchar](20) NOT NULL,
	[ITEMNAME] [nvarchar](60) NOT NULL,
	[MODIFIEDDATETIME] [datetime] NOT NULL,
	[CREATEDDATETIME] [datetime] NOT NULL
) ON [PRIMARY]

Domyslny Collation na bazie: Polish_CI_AS

CREATE TABLE [dbo].[axapta_items](
       [ItemId] [nvarchar](50) NULL,
       [ItemName] [nvarchar](50) NULL,
       [CreatedDateTime] [datetime] NULL,
       [ModifiedDataTime] [datetime] NULL,
       [RecCreateDateTime] [datetime] NULL,
       [InsertSessionID] [uniqueidentifier] NULL

)
0

Dane wstawiane

ItemId	CreatedDateTime	ItemName	                                                        ModifiedDataTime
0-0292	00-01-01 00:00	Gehäuselager Generation 2.0 – nicht angetrieben	15-05-21 10:57

Metoda wywołująca kod SQL na bazie

  def runOperation(self, query, params=None):
    try:
      if params:
        self.dbpool.execute(query, params)
      else:
        self.dbpool.execute(query)
      self.conn.commit()
    except Exception as e:
      self.logerr("Error during executing SQL query '%s' on line %d." % (query, DBWrapper.sqlQueryCounter + 1))
      if params:
        self.logerr("Query params: " + str(params))
      raise e
    
    DBWrapper.sqlQueryCounter += 1

Metoda wczytująca kod z CSV. Przyznam, że nie wygląda ona za dobrze.

  def readFromCSV(self, callback, reader = csv.DictReader, *args, **kwargs):
    readerHandler = reader(self.csvHandler)
    
    for row in readerHandler: #In Windows platform i must decode strings
      if sys.platform == "win32":
        for key in row:
          row[key] = row[key].decode("UTF-8")
          
      callback(row, *args, **kwargs)

Przyznam, że dziwna sytuacja. Czekam jeszcze na informację od klienta jaką ma wersję systemu i w jakiej wersji językowej co może pomoże odtworzyć błąd.

0

Odtworzyłem błąd. Kiedy wczytuje dane bez dekodowania wtedy MSSQL wyświetla dane w postaci chińśkich znaków. wygląda to tak jakby w funkcji readFromCSV nie wykonywał się if.

0

MySQL to nie moja bajka, ale skoro nikt nic jeszcze nie napisał, to może pomoże Ci:
http://banasiak.me/2012/08/mysql-latin1-i-krzaki-zamiast-polskich-znakow/

0

ciąg nvarchar w MSSQL jest kodowany w UCS-2, a nie w UTF-8. Użyj w konwersji UTF-16 i powinno być ok.

1 użytkowników online, w tym zalogowanych: 0, gości: 1