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

标签 sql-server unicode

我需要将值“将值转换为 URL 友好格式 - Unicode 分解 ähhh”转换为“convert-value-into-a-url-friendly-format-unicode-decomposition-ahhh”。 这在 SQL-Server 中可能吗? 所有 Unicode - 应处理字符。

我选择使用 SQL-Server 2005、2008。

编辑

Bogdan 有一个适合我的解决方案。

查询取决于您需要处理的字符,但大多数情况下应该没问题。您确实需要传递一个具有您需要更改的字符的排序规则。西里尔字母很适合。这有点hacky...

声明@input nvarchar(4000) set @input = 'áâãäåæçèéêëëìíîïðñòóôõöùúûüýÿāăąćĉċčĕėəěěĝğġģĥħĩīĭįĵķļľńŋōŏőŕřśŝşťǩūŭůűűŵŻŷ>

SELECT CAST(@input as char(4000) ) COLLATE Cyrillic_General_CI_AS

最佳答案

这是很久以前在某个论坛上找到的一个简单的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 个符号而不是一个,例如 æ = > ae)。

要替换,您可以使用 REPLACE() 函数,但您应该明白,如果调用太多次,性能会受到影响。所以如果你有很多字符替换,你可以使用下面的算法

1)创建一个临时表(或表类型变量),有3列-position int identity(0,1)主键聚簇,原nchar(1)not null,转换后varchar(2)null 2) 使用循环和 SUBSTRING() 函数将字符串拆分为字符并将每个字符插入到此临时表的 original 列 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) 使用循环,将您在 converted 列中的结果连接到一个 varchar() 变量中。

当您将 nvarchar() 转换为 varchar() 时,调用我在上面列出的 urlencode() 函数。

我知道这种情况需要很多 WHEN/THEN,但这取决于您目前使用的语言。如您所见,对于大多数欧洲符号,CAST 到 varchar 会给出完美的结果。

如果您要使用 CLR 函数实现(在 C# 上),您还必须编写大量的 switch/case 语句。因此比较这两种方法,两者都需要相同的开发工作,但 CLR 解决方案将需要额外的管理操作。对于小字符串,CLR 解决方案将运行缓慢(因为 SQL 服务器需要一些时间与 CLR 环境互操作以进行调用,然后取回结果),而对于具有大量替换的大字符串,C# 可能(永远不会检查这个!)可能会更快,因为 SQL 不是字符串操作的最佳语言。

关于sql-server - 将值转换为 URL 友好格式 - Unicode 分解 ähhh,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1232712/

相关文章:

unicode - 🇩🇪 字符在 Swift 字符串中是如何表示的?

python - 尝试使用 ftplib 和 storbinary 存储 png 图像 ==> UnicodeEncodeError

sql-server - 将多个值插入临时表,SQL Server

c# - 我如何在我的 ASP.Net 应用程序上使用 salting+hashing?

SQL Server : SELECT from multiple lines if values exist

php - 如何在 PHP 中从 Unicode 转换表情符号?

sql - SQL Server 中的自然连接

c# - .net - 棘手的 sql 事务(SQL Server,但也考虑到 Oracle,稍后再讲)

PHP:将 unicode 代码点转换为 UTF-8

sql-server-2005 - varchar() 和 nvarchar() 之间奇怪的 SQL Server 2005 排序规则差异