我需要将值“将值转换为URL友好格式 - Unicode分解ähhh”转换为“convert-value-into-a-url-friendly-format-unicode-decomposition-ahhh”。 这在SQL-Server中是否可行? 所有Unicode - 应该处理字符。
我使用SQL-Server 2005,2008作为选项。
修改
波格丹有一个适合我的解决方案。查询取决于您需要处理的字符,但对于大多数情况,它应该没问题。您真的需要传递一个校对,不具有您需要更改的字符。西里尔非常好。这有点像hacky ......
声明@input nvarchar(4000) 设置@input ='áâãäåæçèéêëìíîïðñòóôõöùúûüýÿÿăąćĉċčĕėęěĝğġģĥħĩīĭįĵķļľńňŋōŏőŕřśŝşšťũūŭůűŵŷźžǻǽǿ'
选择CAST(@input as char(4000)) COLLATE Cyrillic_General_CI_A S
答案 0 :(得分:4)
这是一个简单的URL编码功能(它使用varchar作为参数)我很久以前在一些论坛上发现
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
你将如何处理unicode?嗯,如果你不关心印度教或阿拉伯符号但是关心中欧语言,这是非常简单的。您需要的是使用 CAST(@nvarchar as varchar)功能。
让我们检查一下如何使用一些中欧符号。在
中运行以下示例declare @t1 nvarchar(256)
select @t1 = N'áâãäåæçèéêëìíîïðñòóôõöùúûüýÿāăąćĉċčĕėęěĝğġģĥħĩīĭįĵķļľńňŋōŏőŕřśŝşšťũūŭůűŵŷźžǻǽǿ'
select @t1
declare @t2 varchar(512)
select @t2 = cast(@t1 as varchar(512))
select @t2
看看我们会得到什么输出
áâãäåæçèéêëìíîïðñòóôõöùúûüýÿāăąćĉċčĕėęěĝğġģĥħĩīĭįĵķļľńňŋōŏőŕřśŝşšťũūŭůűŵŷźžǻǽǿ
aaaaa?ceeeeiiii?nooooouuuuyyaaacccceeeegggghhiiiijkllnn?ooorrsssstuuuuuwyzz???
因此,大多数符号转换完美,而几个符号将是问号。如果您关心这些符号(例如æ,ð,ŋ),您需要编写一个额外的函数来替换它们,然后转换为您认为最合适的符号(有时2个符号而不是1个符号,例如æ= &gt; ae)。
要替换你可以使用REPLACE()函数,但是你应该明白如果你多次调用它,性能会受到影响。因此,如果你有很多字符替换,你可以使用以下算法
1)创建一个包含3列的临时表(或表类型变量) - position int identity(0,1)primary key clustered,original nchar(1)not null,converted varchar(2)null 2)使用循环和SUBSTRING()函数将字符串拆分为字符并将每个字符插入此临时表的原始列 3)使用一个带有许多WHEN THEN语句的查询转换所有符号
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)使用循环,将转换列中的结果连接到一个varchar()变量中。
将nvarchar()转换为varchar()时,请调用上面列出的urlencode()函数。
我知道这种情况需要很多时间/时间,但这取决于你目前的情况。如您所见,对于大多数欧洲符号,CAST到varchar可以提供完美的结果。
如果你将使用CLR函数实现(在C#上),你也必须编写很多开关/ case语句。因此,比较两种方法都需要相同的开发工作,但CLR解决方案将需要额外的管理操作。对于小字符串,CLR解决方案将缓慢工作(因为SQL服务器需要一些时间来与CLR环境互操作以进行调用,然后返回结果)而对于具有大量替换的大字符串C#可能(从不检查这个!)可能会更快,因为SQL不是字符串操作的最佳语言。
答案 1 :(得分:0)
是的,有可能。答案是“标量值用户定义函数”(UDF)。
我在这里看到两个选项:
除了使用该函数创建程序集并将其部署到服务器之外,第二个选项将要求您在SQL Server中允许CLR集成:
exec sp_configure'clr enabled',1
RECONFIGURE