将值转换为URL友好格式 - Unicode分解ähhh

时间:2009-08-05 11:37:00

标签: sql-server unicode

我需要将值“将值转换为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

2 个答案:

答案 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)。

我在这里看到两个选项:

  1. 在T-SQL中创建一个UDF - 需要相当多的努力,大量使用字符代码[I quess]并且“不会那么快”。
  2. 创建一个CLR UDF - 如果您熟悉.NET,会更快更简单。
  3. 除了使用该函数创建程序集并将其部署到服务器之外,第二个选项将要求您在SQL Server中允许CLR集成:

      

    exec sp_configure'clr enabled',1
      RECONFIGURE