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.