【发布时间】:2010-08-26 19:07:01
【问题描述】:
我有以下字符串
áéíóú
我需要将其转换为
aeiou
我怎样才能实现它? (我不需要比较,我需要新的字符串来保存)
【问题讨论】:
-
我正在寻找可以去除重音符号,但将所有外来字母保留为 Unicode 的解决方案。 IE。我需要将 'á' 转换为 'a',但不要触摸 'я' 或 'жопа'
标签: sql-server
我有以下字符串
áéíóú
我需要将其转换为
aeiou
我怎样才能实现它? (我不需要比较,我需要新的字符串来保存)
【问题讨论】:
标签: sql-server
尝试使用COLLATE:
select 'áéíóú' collate SQL_Latin1_General_Cp1251_CS_AS
对于 Unicode 数据,请尝试以下操作:
select cast(N'áéíóú' as varchar(max)) collate SQL_Latin1_General_Cp1251_CS_AS
我不确定在使用第二种方法时您可能会在翻译中丢失什么。
更新
看来œ是个特例,大小写要分开处理。您可以这样做(此代码非常适合用户定义函数):
declare @str nvarchar(max) = N'ñaàeéêèioô; Œuf un œuf'
select cast(
replace((
replace(@str collate Latin1_General_CS_AS, 'Œ' collate Latin1_General_CS_AS, 'OE' collate Latin1_General_CS_AS)
) collate Latin1_General_CS_AS, 'œ' collate Latin1_General_CS_AS, 'oe' collate Latin1_General_CS_AS) as varchar(max)
) collate SQL_Latin1_General_Cp1251_CS_AS
-- Output:
-- naaeeeeioo; Oeuf un oeuf
用户定义函数
create function dbo.fnRemoveAccents(@str nvarchar(max))
returns varchar(max) as
begin
return cast(
replace((
replace(@str collate Latin1_General_CS_AS, 'Œ' collate Latin1_General_CS_AS, 'OE' collate Latin1_General_CS_AS)
) collate Latin1_General_CS_AS, 'œ' collate Latin1_General_CS_AS, 'oe' collate Latin1_General_CS_AS) as varchar(max)
) collate SQL_Latin1_General_Cp1251_CS_AS
end
【讨论】:
N'áéíóú'。
SELECT cast(N'bœuf' as varchar(max)) collate SQL_Latin1_General_CP1253_CI_AI。结果是“b?uf”。我在测试编码时总是使用那些“–”字母,因为它们经常破坏一切......
有时,字符串可以有另一个 COLLATION,因此结果中仍然有重音符号。在这种情况下,您可以使用此行 (based on this solution here):
SELECT convert(varchar, your_string) COLLATE SQL_Latin1_General_Cp1251_CS_AS;
【讨论】:
使用翻译功能:
SELECT TRANSLATE(
N'INPUT: ïÜ×ÌùµŪč©īĐÃÙěÓńÿâŘåòÔÕłćýçÀŻūìóèůüíÄûØõäÕťżîŃà£êřßøŽÖáďÉęúÂĪāËžŮōÑÇĆź®Š¥ĘĒśŹĚŚšŸ¢ŁéąÈđÆÍÛĄÝĎēČÊŌŇöÏňëÎæãŤñÒÚĀÅÁô',
N'ÁÀÂÃÄÅàáâãäåĀāąĄæÆÇçćĆčČ¢©đĐďĎÈÉÊËèéêëěĚĒēęĘÌÍÎÏìíîïĪīłŁ£ÑñňŇńŃÒÓÔÕÕÖØòóôõöøŌōřŘ®ŠšśŚßťŤÙÚÛÜùúûüůŮŪūµ×¥ŸÿýÝŽžżŻźŹ',
N'aaaaaaaaaaaaaaaaaaccccccccddddeeeeeeeeeeeeeeiiiiiiiiiilllnnnnnooooooooooooooooorrsssssttuuuuuuuuuuuuuxyyyyyzzzzzz');
-- OUTPUT: 'INPUT: iuxiuuuccidaueonyaraooolcycazuioeuuiauooaotzioaleosozoadeeuaiaezuoncczrsyeeszessycleaedaiuaydeceonoineiaatnouaaao'
查看此链接以查找更多“类似”字符:
【讨论】:
我遇到了同样的问题。在希腊语中,要正确转换为 UPPER(),您必须抑制重音。更改排序规则会导致其他应用程序出现问题。放置一些 REPLACE() 函数,我可以更好地控制维护排序规则的行为。下面是我的 ToUpperCaseGR 函数。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create FUNCTION ToUpperCaseGR
(
@word nvarchar(max)
)
RETURNS nvarchar(max)
AS
BEGIN
-- Declare the return variable here
declare @res nvarchar(max)
set @res = UPPER(@word)
set @res = replace(@res,'Ά','Α')
set @res = replace(@res,'Έ','Ε')
set @res = replace(@res,'Ί','Ι')
set @res = replace(@res,'Ή','Η')
set @res = replace(@res,'Ό','Ο')
set @res = replace(@res,'Ύ','Υ')
set @res = replace(@res,'Ώ','Ω')
-- Return the result of the function
RETURN @res
END
GO
【讨论】:
使用此功能:
CREATE FUNCTION [dbo].[F_RemoveDiacritics] (
@String varchar(max)
) RETURNS varchar(max)
AS BEGIN
DECLARE @StringResult VARCHAR(max);
select @StringResult= @String collate SQL_Latin1_General_Cp1251_CS_AS
return @StringResult
END
【讨论】: