Laden...

[erledigt] mit Umlauten suchen - SQL Server findet trotz Collation-Angabe nicht

Erstellt von tkrasinger vor 12 Jahren Letzter Beitrag vor 12 Jahren 7.873 Views
T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 12 Jahren
[erledigt] mit Umlauten suchen - SQL Server findet trotz Collation-Angabe nicht

verwendetes Datenbanksystem: SQL Server 2008 (R2)

SELECT *
FROM ( 
	SELECT cast('Österreich 1' as nvarchar) COLLATE Latin1_General_CI_AI as Bezeichnung 
	UNION
	SELECT cast('Oesterreich 2' as nvarchar) COLLATE Latin1_General_CI_AI as Bezeichnung 
) Data
WHERE Bezeichnung like ('%ö%')

vgl zu:

SELECT *
FROM ( 
	SELECT cast('Österreich 1' as nvarchar) COLLATE Latin1_General_CI_AI as Bezeichnung 
	UNION
	SELECT cast('Oesterreich 2' as nvarchar) COLLATE Latin1_General_CI_AI as Bezeichnung 
) Data
WHERE Bezeichnung like ('%öst%')

Mit der angegeben Collation sollte oe/ö eigentlich egal sein, beim oberen Statement geht das auch, warum funktioniert das untere nicht?

Muss ich wirklich im Suchstring die Umlaute ersetzen?

und warum funktioniert im Vergleich dazu dieses hier wie erwartet:

SELECT *
FROM ( 
	SELECT cast('DassV1' as nvarchar) COLLATE Latin1_General_CI_AI as Bezeichnung 
	UNION
	SELECT cast('DaßV2' as nvarchar) COLLATE Latin1_General_CI_AI as Bezeichnung 
) Data
WHERE Bezeichnung like ('%DaßV%')

EDIT:
Umlaut ersetzen geht gar nicht, weil er dann den Eintrag mit dem Ö gar nicht findet. Wie schaffe ich es, nach "öst" zu suchen und beide Einträge zu bekommen (ohne ein OR zu verwenden)

T
415 Beiträge seit 2007
vor 12 Jahren

Umlaut ersetzen geht gar nicht, weil er dann den Eintrag mit dem Ö gar nicht findet. Wie schaffe ich es, nach "öst" zu suchen und beide Einträge zu bekommen (ohne ein OR zu verwenden)

Ich hab das REPLACE einfach mal anders rum gemacht. Damit gehts. Wär das ne Alternative?


SELECT *
FROM (
	SELECT REPLACE(cast('Österreich 1' as char), 'Oe', 'Ö')  as Bezeichnung
	UNION
	SELECT REPLACE(cast('Oesterreich 2' as char), 'Oe', 'Ö') as Bezeichnung
) Data
WHERE Bezeichnung LIKE ('%öst%')

D
216 Beiträge seit 2009
vor 12 Jahren

warum funktioniert das untere nicht?

Weil LIKE '%ö%' auf alles mit 'o', 'ö', 'ô', 'ó', 'ò',... matcht, und du deswegen mit '%ö%' das 'o' in 'oe' findest. Wenn du aber nach '%öst%' suchst, würdest du zwar 'Österreich' und 'Osterreich' finden, aber halt kein 'Oesterreich', da das 'ö' nicht für Oe steht, sondern halt nur für das O.

Darth Maim

T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 12 Jahren

@Darth Maim.

Danke, ich wusste nicht, dass mit dem AI tatsächlich nur ein ö = o gemeint ist und nicht ö = oe.

In Kombination mit der Variante von t2t habe ich nun das WHERE umgebaut und damit funktioniert es:

SELECT *
FROM (
	SELECT 'Österreich 1'  as Bezeichnung
	UNION
	SELECT 'Oesterreich 2' as Bezeichnung
) Data
WHERE dbo.fn_ReplaceSpecialChars( Bezeichnung) LIKE dbo.fn_ReplaceSpecialChars( '%öst%')

Danke