none
Probleme mit Sonderzeichen Übertrag zwischen Datenbanken RRS feed

  • Frage

  • Hallo Zusammen,

    ich habe zwei Datenbanken und in einer Tabelle der Quell-Datenbank steht in einer Spalte des Typs nvarchar(254) folgender Text: ≤ 17,50 EU/ml

    Wenn ich nun diesen Text per Insert into Zieldatenbank in die Zielspalte nvarchar(254) schreibe, kommt dort ein = anstatt des Zeichens ≤ an.

    Wieso kann das Zeichen nicht 1:1 übertragen werden? Ich habe es noch mit COLLATE versucht, das aber auch nicht geholfen hat.

    Vielen Dank vorab für eure Ideen.

    Viele Grüße Daniel

    Donnerstag, 17. November 2022 18:54

Antworten

  • Hallo Daniel,

    insert into BTBogen (AngebotNR,SpezifikationEWert)
    select _BEZEICHNUNG,_BCEWERT from XEK where ID=X 

    ändert es etwas, wenn Du dieses SQL Statement direkt, bspw. per SSMS, gegen die Datenbank ausführst?

    Betroffene Spalte _BCEWERT Collation in der Quelltabelle: Latin1_General_CS_AS Betroffene Spalte SpezifikationEWert Collation in der Zieltabelle: Latin1_General_CI_AS

    Da die Quelldatenbank und die Quelltabelle Latin1_Generial_CI_AS und nur die eine Spalte dann nicht CI, sondern CS hat: Lässt sich das ändern? Bzw. kannst Du die Sortierung in der Zielspalte SpezifikationEWert auch auf CS ändern?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport



    Freitag, 2. Dezember 2022 21:44
    Moderator

Alle Antworten

  • Hallo Daniel,

    poste doch mal die exakte Tabellen- und Spaltendefinition (am besten die CREATE TABLE Statements auf beiden Seiten erzeugen lassen). Dann sieht man, ob es evtl. Unterschiede gibt.

    Die Collations beider Datenbanken/Tabellen wäre auch wichtig.

    Dein Skript ist wo und wie aufgebaut? Ist die Skriptedatei als UTF-8, Unicode, Ascii, ... gespeichert?

    Wo genau wird die Übertragung auf welchem Weg vorgenommen?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 17. November 2022 23:30
    Moderator
  • Mit welchem Programm schreibst du den Insert?

    Das Problem ist i.d.R. dass ein Commandtext selber nicht als Unicode interpretiert wird. Somit ist ein Unicodetext als Konstante nicht möglich.
    Du musst hierzu ein Commandobjekt mit Parametern erstellen und den Parametermarker "?" als Typ String defineiren:

    cmd.cmdtext = "Insert into table (f1) value(?)"
    cmd.parameters.add(new Parameter(type String, value))
    cmd.execute()

    Je nach verwendeter Sprache differniert dies dann.

    Freitag, 18. November 2022 10:00
  • Hi Stefan,

    vielen Dank für deine Antwort.

    Das ganze wird aus dem Makro Editor unserer Warenwirtschaft ausgeführt. Ich weiß nicht was dem Makro als Grundlage dient (UTF-8 etc.)

    Hier das Create Statement der Tabelle 1 (Quelle):

    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    CREATE TABLE [dbo].[XEK](
        [XENDKONTROLLE_ID] [int] IDENTITY(1,1) NOT NULL,
        [ID] [int] NULL,
        [AngelegtAm] [datetime] NULL,
        [AngelegtVon] [nvarchar](2) NULL,
        [BearbeitetAm] [datetime] NULL,
        [BearbeitetVon] [nvarchar](2) NULL,
        [TS] [timestamp] NOT NULL,
        [_BEZEICHNUNG] [nvarchar](254) NULL,
        [_BCEWERT] [nvarchar](254) NULL,
     CONSTRAINT [PK_XENDKONTROLLE] PRIMARY KEY CLUSTERED
    (
        [XENDKONTROLLE_ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO

    Hier das Create Statement der Tabelle 2 (Ziel):

    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[BTBogen](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [AngebotNR] [varchar](254) NULL,
        [SpezifikationEWert] [nvarchar](254) NULL
     CONSTRAINT [PK_BT_BIOCHEM_Bogen] PRIMARY KEY CLUSTERED
    (
        [ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO

    Was die Unterschiede der Collations angeht:

    Quell-Datenbank-Collation: Latin1_General_CI_AS
    Ziel-Datenbank-Collation: Latin1_General_CI_AS

    Quell-Tabelle-Collation: Latin1_General_CI_AS
    Ziel-Tabelle-COllation: Latin1_General_CI_AS

    Betroffene Spalte _BCEWERT Collation in der Quelltabelle: Latin1_General_CS_AS
    Betroffene Spalte SpezifikationEWert Collation in der Zieltabelle: Latin1_General_CI_AS

    Das Statement sieht so aus:

    insert into BTBogen (AngebotNR,SpezifikationEWert)
    select _BEZEICHNUNG,_BCEWERT from XEK where ID=X

    Vielen Dank nochmal für eure Ideen :-)

    Danke Daniel

    Freitag, 2. Dezember 2022 20:16
  • Hallo Daniel,

    insert into BTBogen (AngebotNR,SpezifikationEWert)
    select _BEZEICHNUNG,_BCEWERT from XEK where ID=X 

    ändert es etwas, wenn Du dieses SQL Statement direkt, bspw. per SSMS, gegen die Datenbank ausführst?

    Betroffene Spalte _BCEWERT Collation in der Quelltabelle: Latin1_General_CS_AS Betroffene Spalte SpezifikationEWert Collation in der Zieltabelle: Latin1_General_CI_AS

    Da die Quelldatenbank und die Quelltabelle Latin1_Generial_CI_AS und nur die eine Spalte dann nicht CI, sondern CS hat: Lässt sich das ändern? Bzw. kannst Du die Sortierung in der Zielspalte SpezifikationEWert auch auf CS ändern?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport



    Freitag, 2. Dezember 2022 21:44
    Moderator
  • Für eine Spalte nvarchar ist die Collation, also die Sprache uninteressant, da die Spalte in Unicode gespeichert wird. Allenfalls eine Sortierfolge für Abfragen kann z.B. case insensitive oder accent sensitive sein.
    Somit sind dort alle Zeichen möglich.
    Leider ist die Zielspalte varchar und somit nicht Unicode und da kann es zu Zeichenverlusten kommen.

    Nun weiß ich nicht wie letztlich der SQL-Server mit wechselnden Zeichensätzen automatisiert helfen kann. Dem kann man aber nachhelfen, dass man das NVARCHAR Feld explizit in die Sprache der Ziel-DB/-Tabelle casten kann.

    Also

    convert(_BEZEICHNUNG to varchar(nn)) collation <Zielcollation>

    Dann werden die Zeichen entsprechend konvertiert. Allerdings kann es vorkommen, dass Zeichen in nvarchar in der Zielcollation nicht vorkommen. Dies führt
    a) zu synonymen Ersetzungen
    b) zur Ersetzung als "?".

    Wenn es also das Zeichen in der Zielcollation nicht gibt, kann man es auch nicht übertragen..

    https://learn.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver16

    Heir speziell den Bereich Unicode.


    Samstag, 3. Dezember 2022 21:32
  • Hi,
    Leider ist die Zielspalte varchar und somit nicht Unicode

    wie kommst Du darauf?

    [_BCEWERT] [nvarchar](254) NULL,
    [SpezifikationEWert] [nvarchar](254) NULL

    Lt. Daniel sind das die betroffenen Spalten.

    Wären die Spalten _BEZEICHNUNG und AngebotNR betroffen, würde ich dir ja zustimmen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Sonntag, 4. Dezember 2022 07:26
    Moderator
  • Entschuldigung, hab mich verguckt.
    Sonntag, 4. Dezember 2022 19:49
  • Hallo Daniel,

    insert into BTBogen (AngebotNR,SpezifikationEWert)
    select _BEZEICHNUNG,_BCEWERT from XEK where ID=X 

    ändert es etwas, wenn Du dieses SQL Statement direkt, bspw. per SSMS, gegen die Datenbank ausführst?

    Betroffene Spalte _BCEWERT Collation in der Quelltabelle: Latin1_General_CS_AS Betroffene Spalte SpezifikationEWert Collation in der Zieltabelle: Latin1_General_CI_AS

    Da die Quelldatenbank und die Quelltabelle Latin1_Generial_CI_AS und nur die eine Spalte dann nicht CI, sondern CS hat: Lässt sich das ändern? Bzw. kannst Du die Sortierung in der Zielspalte SpezifikationEWert auch auf CS ändern?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport



    Tatsächlich hat genau dies (also Anpassung der Ziel-Spalte) zum Erfolg geführt :-) Vielen Dank :-)

    • Bearbeitet CNTEC Mittwoch, 21. Dezember 2022 07:24
    Mittwoch, 21. Dezember 2022 07:24
  • Hallo Daniel,

    Tatsächlich hat genau dies (also Anpassung der Ziel-Spalte) zum Erfolg geführt :-)

    super, das freut mich.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Mittwoch, 21. Dezember 2022 07:34
    Moderator