TSQL - 如何进行 URL 编码

问题描述 投票:0回答:5

寻找一个经过测试的无 bug 的 sql 脚本,我可以在 UDF 中使用该脚本通过 sql 对 url 进行编码。函数将接收一个 URL 并传递出一个 URL 编码的 URL。我看过一些,但我遇到的似乎都有一些缺陷。

sql sql-server t-sql
5个回答
14
投票

Peter DeBetta 的这个怎么样

CREATE FUNCTION dbo.UrlEncode(@url NVARCHAR(1024)) RETURNS NVARCHAR(3072) AS BEGIN DECLARE @count INT, @c NCHAR(1), @i INT, @urlReturn NVARCHAR(3072) SET @count = LEN(@url) SET @i = 1 SET @urlReturn = '' WHILE (@i <= @count) BEGIN SET @c = SUBSTRING(@url, @i, 1) IF @c LIKE N'[A-Za-z0-9()''*\-._!~]' COLLATE Latin1_General_BIN ESCAPE N'\' COLLATE Latin1_General_BIN BEGIN SET @urlReturn = @urlReturn + @c END ELSE BEGIN SET @urlReturn = @urlReturn + '%' + SUBSTRING(sys.fn_varbintohexstr(CAST(@c AS VARBINARY(MAX))),3,2) + ISNULL(NULLIF(SUBSTRING(sys.fn_varbintohexstr(CAST(@c AS VARBINARY(MAX))),5,2), '00'), '') END SET @i = @i +1 END RETURN @urlReturn END
    

8
投票
这个问题特别要求一个函数,但是如果您无法创建任何函数,这里有一个 url 编码的解决方案:

select replace27 from TableName cross apply (select replace1 = replace(T.TagText, '%', '%25')) r1 cross apply (select replace2 = replace(replace1, '&', '%26')) r2 cross apply (select replace3 = replace(replace2, '$', '%24')) r3 cross apply (select replace4 = replace(replace3, '+', '%2B')) r4 cross apply (select replace5 = replace(replace4, ',', '%2C')) r5 cross apply (select replace6 = replace(replace5, ':', '%3A')) r6 cross apply (select replace7 = replace(replace6, ';', '%3B')) r7 cross apply (select replace8 = replace(replace7, '=', '%3D')) r8 cross apply (select replace9 = replace(replace8, '?', '%3F')) r9 cross apply (select replace10 = replace(replace9, '@', '%40')) r10 cross apply (select replace11 = replace(replace10, '#', '%23')) r11 cross apply (select replace12 = replace(replace11, '<', '%3C')) r12 cross apply (select replace13 = replace(replace12, '>', '%3E')) r13 cross apply (select replace14 = replace(replace13, '[', '%5B')) r14 cross apply (select replace15 = replace(replace14, ']', '%5D')) r15 cross apply (select replace16 = replace(replace15, '{', '%7B')) r16 cross apply (select replace17 = replace(replace16, '}', '%7D')) r17 cross apply (select replace18 = replace(replace17, '|', '%7C')) r18 cross apply (select replace19 = replace(replace18, '^', '%5E')) r19 cross apply (select replace20 = replace(replace19, ' ', '%20')) r20 cross apply (select replace21 = replace(replace20, '~', '%7E')) r21 cross apply (select replace22 = replace(replace21, '`', '%60')) r22 cross apply (select replace23 = replace(replace22, '*', '%2A')) r23 cross apply (select replace24 = replace(replace23, '(', '%28')) r24 cross apply (select replace25 = replace(replace24, ')', '%29')) r25 cross apply (select replace26 = replace(replace25, '/', '%2F')) r26 cross apply (select replace27 = replace(replace26, '\', '%5C')) r27

此解决方案的局限性在于它不能替换 ASCII 控制字符或非 ASCII 字符。

请注意,第一次替换是 % ,这一点很重要,这样我们就不会转义任何转义码。


5
投票
SQL Sunday 的 Daniel Hutmacher 提供了一个很好的函数。


https://sqlsunday.com/2013/04/07/url-encoding-function/

注意:正如作者在文章末尾所指出的,十六进制转换函数仅适用于非 unicode 字符值(8 位字符)

CREATE FUNCTION dbo.fn_char2hex(@char char(1)) RETURNS char(2) AS BEGIN DECLARE @hex char(2), @dec int; SET @dec=ASCII(@char); SET @hex= --- First hex digit: SUBSTRING('0123456789ABCDEF', 1+(@dec-@dec%16)/16, 1)+ --- Second hex digit: SUBSTRING('0123456789ABCDEF', 1+( @dec%16) , 1); RETURN(@hex); END CREATE FUNCTION dbo.fn_UrlEncode(@string varchar(max)) RETURNS varchar(max) AS BEGIN DECLARE @offset int, @char char(1); SET @string = REPLACE(@string, '%', '%' + dbo.fn_Char2Hex('%')); SET @offset=PATINDEX('%[^A-Z0-9.\-\%]%', @string); WHILE (@offset!=0) BEGIN; SET @char = SUBSTRING(@string, @offset, 1); SET @string = REPLACE(@string, @char, '%' + dbo.fn_Char2Hex(@char)); SET @offset = PATINDEX('%[^A-Z0-9.\-\%]%', @string); END RETURN @string; END;
    

4
投票
就我个人而言,我会在应用程序而不是数据库中执行此操作 - 但如果您出于某种原因必须这样做并且可以启用 CLR 集成,那么这将是

CLR UDF 的完美候选者。它比尝试使用 SQL 更简单,而且可能更可靠、更高效。

免费版的

SQLsharp T-SQL CLR 扩展库

中有 
INET_URIEncode
INET_URIDecode 函数。它也可以处理 Unicode,但您需要付费版本来处理非标准 %uXXYY
 编码。


-11
投票
为了使用此脚本,您需要使用数字表。

CREATE FUNCTION [dbo].[URLEncode] (@decodedString VARCHAR(4000)) RETURNS VARCHAR(4000) AS BEGIN /****** * select dbo.URLEncode('K8%/fwO3L mEQ*.}') **/ DECLARE @encodedString VARCHAR(4000) IF @decodedString LIKE '%[^a-zA-Z0-9*-.!_]%' ESCAPE '!' BEGIN SELECT @encodedString = REPLACE( COALESCE(@encodedString, @decodedString), SUBSTRING(@decodedString,num,1), '%' + SUBSTRING(master.dbo.fn_varbintohexstr(CONVERT(VARBINARY(1),ASCII(SUBSTRING(@decodedString,num,1)))),3,3)) FROM dbo.numbers WHERE num BETWEEN 1 AND LEN(@decodedString) AND SUBSTRING(@decodedString,num,1) like '[^a-zA-Z0-9*-.!_]' ESCAPE '!' END ELSE BEGIN SELECT @encodedString = @decodedString END RETURN @encodedString END GO

该脚本在

SQL Server Central 上完全可用(需要注册)

© www.soinside.com 2019 - 2024. All rights reserved.