Как я могу удалить акценты на строке?
У меня есть следующая строка
áéíóú
который мне нужно преобразовать в
aeiou
Как мне этого добиться? (Мне не нужно сравнивать, мне нужно сохранить новую строку)
6 ответов
Попробуйте использовать 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
Используйте функцию перевода:
SELECT TRANSLATE(
N'INPUT: ïÜ×ÌùµŪč©īĐÃÙěÓńÿâŘåòÔÕłćýçÀŻūìóèůüíÄûØõäÕťżîŃà£êřßøŽÖáďÉęúÂĪāËžŮōÑÇĆź®Š¥ĘĒśŹĚŚšŸ¢ŁéąÈđÆÍÛĄÝĎēČÊŌŇöÏňëÎæãŤñÒÚĀÅÁô',
N'ÁÀÂÃÄÅàáâãäåĀāąĄæÆÇçćĆčČ¢©đĐďĎÈÉÊËèéêëěĚĒēęĘÌÍÎÏìíîïĪīłŁ£ÑñňŇńŃÒÓÔÕÕÖØòóôõöøŌōřŘ®ŠšśŚßťŤÙÚÛÜùúûüůŮŪūµ×¥ŸÿýÝŽžżŻźŹ',
N'aaaaaaaaaaaaaaaaaaccccccccddddeeeeeeeeeeeeeeiiiiiiiiiilllnnnnnooooooooooooooooorrsssssttuuuuuuuuuuuuuxyyyyyzzzzzz');
-- OUTPUT: 'INPUT: iuxiuuuccidaueonyaraooolcycazuioeuuiauooaotzioaleosozoadeeuaiaezuoncczrsyeeszessycleaedaiuaydeceonoineiaatnouaaao'
Перейдите по этой ссылке, чтобы найти больше похожих персонажей:
Иногда у строки может быть другая COLLATION, так что в результате все еще остаются акценты. В этом случае вы можете использовать эту строку ( на основе этого решения здесь):
SELECT convert(varchar, your_string) COLLATE SQL_Latin1_General_Cp1251_CS_AS;
У меня такая же проблема. На греческом языке для правильного преобразования в 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
Используйте функцию TRANSLATE() вместе с COLLATE и нечувствительным к диакритическому знаку (AI
) сопоставление, чтобы сделать простую универсальную замену:
SELECT TRANSLATE('TÉST ínpüt' COLLATE Latin1_General_CS_AI, 'AEIOUaeiou', 'AEIOUaeiou')
-- OUTPUT: 'TEST input'
Используйте эту функцию:
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