3 Stimmen

Wert in ein URL-freundliches Format umwandeln - Unicode-Dekomposition ähhh

Ich muss einen Wert "Wert in ein URL-freundliches Format umwandeln - Unicode-Zerlegung ähhh" in "Wert in ein URL-freundliches Format umwandeln - Unicode-Zerlegung-ahhh" umwandeln. Ist dies in SQL-Server möglich? Alle Unicode-Zeichen sollten verarbeitet werden.

Ich verwende SQL-Server 2005 und 2008 als Option.

EDIT

Bogdan hatte eine Lösung, die bei mir funktionierte.

Die Abfrage hängt von der Anzahl der Zeichen ab, mit denen Sie umgehen müssen, aber in den meisten Fällen sollte sie in Ordnung sein. Sie müssen wirklich eine Sortierung übergeben, die no haben die Zeichen, die Sie ändern müssen. Kyrillisch ist dafür gut geeignet. Das ist ein bisschen hakelig...

deklarieren Sie @input nvarchar(4000) set @input = 'áâãäåæçèéêëìíîïðñòóôõöùúûüýÿšž'

SELECT CAST(@Eingabe als char(4000) ) COLLATE Kyrillisch_Allgemein_CI_A S

4voto

Bogdan_Ch Punkte 3236

Hier ist eine einfache URL-Codierungsfunktion (sie verwendet varchar als Parameter), die ich vor langer Zeit in einem Forum gefunden habe

create function urlencode(@str as varchar(4000))
returns varchar(4000)
as
begin
declare @hex char(16)
declare @c char(1)
set @hex='0123456789ABCDEF'
declare @ostr varchar(4000)
set @ostr=''
declare @l int
set @l = 1
while @l <= len(@str)
begin
 set @c = substring(@str,@l,1)
 if @c between '0' and '9'
 or @c between 'A' and 'Z'
 or @c between 'a' and 'z'
  set @ostr = @ostr + @c
  else
  set @ostr = @ostr + '%' +
    substring(@hex,(ascii(@c)/16)+1,1)
   +substring(@hex,(ascii(@c)&15)+1,1)
 set @l=@l+1
end
return @ostr
end
go 

Wie werden Sie mit Unicode umgehen? Nun, das ist ganz einfach, wenn Sie sich nicht für hinduistische oder arabische Symbole interessieren, wohl aber für mitteleuropäische Sprachen. Was Sie brauchen, ist die Verwendung von CAST(@nvarchar as varchar) Funktion.

Sehen wir uns an, wie das mit einigen mitteleuropäischen Symbolen funktioniert. Führen Sie das folgende Beispiel in

declare @t1 nvarchar(256)
select @t1 = N'áâãäåæçèéêëìíîïðñòóôõöùúûüýÿšž'
select @t1
declare @t2 varchar(512)
select @t2 = cast(@t1 as varchar(512))
select @t2

Und sehen Sie, welche Ausgabe wir erhalten werden

áâãäåæçèéêëìíîïðñòóôõöùúûüýÿšž
aaaaa?ceeeeiiii?nooooouuuuyyaaacccceeeegggghhiiiijkllnn?ooorrsssstuuuuuwyzz???

Die meisten Symbole wurden also perfekt umgewandelt, während einige Symbole mit Fragezeichen versehen sind. Wenn Sie sich für solche Symbole interessieren (z. B. æ, ð, ), müssen Sie eine zusätzliche Funktion schreiben, die sie vor der Konvertierung durch etwas ersetzt, das Sie für sie am geeignetsten finden (manchmal 2 Symbole anstelle von einem, z. B. æ => ae).

Zum Ersetzen können Sie die Funktion REPLACE() verwenden, aber Sie sollten sich darüber im Klaren sein, dass die Leistung leidet, wenn Sie sie zu oft aufrufen. Wenn Sie also viele Zeichen ersetzen müssen, können Sie den folgenden Algorithmus verwenden

1) Erstellen Sie eine temporäre Tabelle (oder Tabellentyp-Variable) mit 3 Spalten - position int identity(0,1) primary key clustered, original nchar(1) not null, converted varchar(2) null 2) Verwenden Sie eine Schleife und die Funktion SUBSTRING(), um die Zeichenkette in Zeichen aufzuteilen und jedes Zeichen in die Tabelle einzufügen. Original Spalte dieser temporären Tabelle 3) Mit einer Abfrage mit vielen WHEN THEN-Anweisungen alle Symbole konvertieren

update @temp_table
set converted = CASE original 
     WHEN N'æ' THEN 'ae' 
     WHEN N'' THEN 'n'
     ... and so on ...
     ELSE CAST(original AS VARCHAR(2))

4) Verketten Sie in einer Schleife die Ergebnisse, die Sie in umgewandelt Spalte in eine varchar()-Variable.

Wenn Sie nvarchar() in varchar() umgewandelt haben, rufen Sie die oben genannte Funktion urlencode() auf.

Ich verstehe, dass dieser Fall eine Menge WENN/DANN erfordert, aber es hängt davon ab, welche Sprachen Sie derzeit haben. Wie Sie sehen, ergibt CAST to varchar für die meisten europäischen Symbole ein perfektes Ergebnis.

Wenn Sie mit CLR-Funktionsimplementierung (auf C#) gehen, müssen Sie eine Menge von Switch/Case-Anweisungen zu schreiben. Wenn man also beide Ansätze vergleicht, erfordern beide den gleichen Entwicklungsaufwand, aber die CLR-Lösung erfordert zusätzliche Verwaltungsmaßnahmen. Für kleine Zeichenketten wird die CLR-Lösung langsam arbeiten (weil der SQL-Server einige Zeit benötigt, um mit der CLR-Umgebung zu interagieren, um den Aufruf durchzuführen und dann die Ergebnisse zurückzubekommen), während für große Zeichenketten mit vielen Ersetzungen C# vielleicht (ich habe das nie überprüft!) könnte schneller sein, weil SQL nicht die beste Sprache für Stringmanipulationen ist.

0voto

AlexS Punkte 2378

Ja, das ist möglich. Die Antwort lautet "Skalarwertige benutzerdefinierte Funktion" (UDF).

Ich sehe hier zwei Möglichkeiten:

  1. Erstellen Sie eine UDF in T-SQL - das ist ziemlich aufwändig, erfordert viel Arbeit mit Zeichencodes und ist nicht so schnell.
  2. Erstellen Sie eine CLR UDF - viel schneller und einfacher, wenn Sie mit .NET vertraut sind.

Bei der zweiten Option müssen Sie nicht nur die CLR-Integration in SQL Server zulassen, sondern auch eine Assembly mit der Funktion erstellen und sie auf dem/den Server(n) bereitstellen:

exec sp_configure 'clr aktiviert', 1
REKONFIGURIEREN

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X