Zum Inhalt springen

Charset ändern? Daten aus 2 verschiedenen Datenbanken


Empfohlene Beiträge

Geschrieben

Hallo,

ich soll in MSSQL ein Select erstellen das Daten von 2 verschiedenen Datenbanken miteinander verknüpft und bekomme folgende Fehlermeldung:

Ein Sortierungskonflikt zwischen "SQL_Latin1_General_CP1_CI_AS" und "Latin1_General_CI_AS" im equal to-Vorgang kann nicht aufgelöst werden.

Hab mir angelesen das man das Charset ändern muss, hat das schon mal jemand gemacht? Kann das Auswirkungen auf die Datenbank haben in Form von Folgen oder unerwünschten Effekten?

Bin in Sachen Datenbanken Anfänger ( 2.LJ Ausbildung ) und würde mich über ein wenig Hilfe freuen.

Gruß

YTMFB

Geschrieben

Das Problem hat man öfter mit Daten aus anderssprachigen Systemen oder auch alten SQL-Server Datenbanken.

Die Sortierung der zu joinenden Spalten muss übereinstimmen/dem Server mitgeteilt werden.

Es gibt meist mehrere Stellen, an denen man eine (Standard-)Sortierung (Collation) einstellen kann - afair pro Server, Datenbank und Spalte.

Ändern geht generell per ALTER TABLE Anweisung - siehe Collation and Unicode Support

Bsp:


ALTER TABLE foo ALTER COLUMN bar char(8) COLLATE SQL_Latin1_General_CP1_CI_AS

ALTER TABLE bla ALTER COLUMN blub char(8) COLLATE Latin1_General_CI_AS
Wenn man die Standard-Collation der Datenbank nehmen möchte kann man auch "DATABASE_DEFAULT" statt z.B. "Latin1_General_CI_AS" schreiben. Alternativ zum Ändern der Tabelle kann man z.B. beim JOIN auch mittels COLLATE direkt angeben, wie man die Spalten behandeln möchte: Ein "kleines" Beispiel (ist doch länger geworden):

--drop table #foo

--drop table #bla


-- Wir legen zwei Tabellen an:

CREATE TABLE #foo (bar char(8))

CREATE TABLE #bla (blub char(8))



-- Setzen die Spalten auf unterschiedliche Sortierung:

ALTER TABLE #foo ALTER COLUMN bar char(8) COLLATE SQL_Latin1_General_CP1_CI_AS

ALTER TABLE #bla ALTER COLUMN blub char(8) COLLATE Latin1_General_CI_AS


-- Und fügen ein paar Werte ein:

INSERT INTO #foo (bar)  VALUES ('1'), ('2'), ('3'), ('ss')

INSERT INTO #bla (blub) VALUES ('1'), ('2'), ('3'), ('ß')


-- Und fragen ab:

--SELECT #foo.bar, #bla.blub FROM #foo 

--INNER JOIN #bla ON #foo.bar = #bla.blub -- Auskommentiert, würde fehlschlagen wegen unterschiedlicher Sortierung




SELECT #foo.bar, #bla.blub FROM #foo 

INNER JOIN #bla ON #foo.bar = #bla.blub COLLATE SQL_Latin1_General_CP1_CI_AS -- SQL_Latin1_General_CP1_CI_AS behandelt ss und ß unterschiedlich -> kein Treffer beim Join bei den letzten Zeilen!




SELECT #foo.bar, #bla.blub FROM #foo 

INNER JOIN #bla ON #foo.bar = #bla.blub COLLATE Latin1_General_CI_AS -- 'ss' und 'ß' sind hier gleichwertig!


Man beachte, dass in dem Beispiel die Collation Latin1_General_CI_AS bei CHAR keinen Unterschied zwischen 'ss' und 'ß' macht - bei NCHAR würde es wieder anders aussehen..

In anderen Sprachen gibt's noch viel mehr Spass mit Sortierungen :)

Man sollte sich die Sache mit den Sortierungen wirklich mal zu Gemüte führen und zumindest ansatzweise verstehen, was im Hintergrund passiert - wäre eigentlich Stoff für die Berufsschule..

Grüße

Sascha

Geschrieben

Vielen dank, die Lösung mit dem Casten ist für mich relevant gewesen, da ich alter mit meiner Berechtigungsstufe nicht anwenden darf.

Gruß

YTMFB

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...