Benutzer mit den meisten Antworten
Probleme mit Sonderzeichen Übertrag zwischen Datenbanken

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
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
- Bearbeitet Stefan FalzModerator Freitag, 2. Dezember 2022 21:47
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Moderator Dienstag, 20. Dezember 2022 13:29
- Als Antwort markiert CNTEC Mittwoch, 21. Dezember 2022 07:22
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 -
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.
-
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]
GOHier 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]
GOWas 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_ASDas Statement sieht so aus:
insert into BTBogen (AngebotNR,SpezifikationEWert)
select _BEZEICHNUNG,_BCEWERT from XEK where ID=XVielen Dank nochmal für eure Ideen :-)
Danke Daniel
-
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
- Bearbeitet Stefan FalzModerator Freitag, 2. Dezember 2022 21:47
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Moderator Dienstag, 20. Dezember 2022 13:29
- Als Antwort markiert CNTEC Mittwoch, 21. Dezember 2022 07:22
-
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..
Heir speziell den Bereich Unicode.
- Bearbeitet Der Suchende Samstag, 3. Dezember 2022 21:40
-
Hi,
Leider ist die Zielspalte varchar und somit nicht Unicode
wie kommst Du darauf?
[_BCEWERT] [nvarchar](254) NULL,
[SpezifikationEWert] [nvarchar](254) NULLLt. 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 -
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
- Bearbeitet CNTEC 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