- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要将值“将值转换为 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)null2) 使用循环和 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/
在 MySQL 中,我试图获取两个时间戳值之间的差异并将结果存储在时间列中。但有时结果会以 'hhh:mm:ss' 格式出现。在尝试使用 Result.getTime() 访问 Java 中的该列时,
我有这种格式的时间, 72.345, 72.629, 71.327, ... 作为在 Python 中执行计算的结果。似乎将它们转换为 HH:MM:SS 格式的最简单方法是使用 datetime 模块
我知道 hh:mm:ss 是 time_object.strftime('%H:%M:%S')。我使用此格式的时间超过 24 小时,因此小时部分溢出。在 strftime 中获取 hhh:mm:ss
这似乎是一个新手问题,但我真的很挣扎。 我在 mysql 数据库中有一个时间字段。我正在使用 vb.net 2012。我试图在时间字段中插入时间量。我决定使用文本框并让用户输入小数形式的时间量 (1:
我是一名优秀的程序员,十分优秀!