67 votes

Comment supprimer les accents sur une chaîne de caractères ?

J'ai la chaîne suivante

áéíóú

que je dois convertir en

aeiou

Comment puis-je l'atteindre ? (Je n'ai pas besoin de comparer, j'ai besoin de la nouvelle chaîne à sauvegarder)

0 votes

Je cherche une solution qui supprime les accents, mais laisse toutes les lettres étrangères en Unicode. Par exemple, je dois convertir 'á' en 'a', mais sans toucher à '' ou ''.

127voto

RedFilter Points 84190

Essayez d'utiliser COLLATE :

select 'áéíóú' collate SQL_Latin1_General_Cp1251_CS_AS

Pour les données Unicode, essayez ce qui suit :

select cast(N'áéíóú' as varchar(max)) collate SQL_Latin1_General_Cp1251_CS_AS

Je ne suis pas sûr de ce que vous pouvez perdre dans la traduction en utilisant la deuxième approche.

Mise à jour

On dirait que œ est un cas particulier, et nous devons traiter séparément les majuscules et les minuscules. Vous pouvez le faire comme ceci (ce code est un bon candidat pour une fonction définie par l'utilisateur) :

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

Fonction définie par l'utilisateur

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

4 votes

Ne fonctionne que pour les colonnes non unicode. C'est-à-dire qu'il ne fonctionnera pas pour N'áéíóú' .

0 votes

Je cherche une solution qui supprime les accents, mais laisse toutes les lettres étrangères en Unicode. Par exemple, je dois convertir 'á' en 'a', mais sans toucher à '' ou ''.

1 votes

@MikeKeskinov il serait préférable de poser cette question dans un nouvel article.

9voto

Yolofy Points 96

Utilisez la fonction de traduction :

SELECT TRANSLATE(
N'INPUT: ïÜ×Ìùµ©ÃÙÓÿâåòÔÕýçÀìóèüíÄûØõäÕîà£êßøŽÖáÉú¥šŸ¢éÈÆÍÛÝÊöÏëÎæãñÒÚÅÁô',
N'ÁÀÂÃÄÅàáâãäåæÆÇÈÉÊËèéêëÌÍÎÏìíîï£ÑñÒÓÔÕÕÖØòóôõöø®ŠšßÙÚÛÜùúûüµŸÿýž', 
N'aaaaaaaaaaaaaaaaaaccccccccddddeeeeeeeeeeeeeeiiiiiiiiiilllnnnnnooooooooooooooooorrsssssttuuuuuuuuuuuuuxyyyyyzzzzzz');

-- OUTPUT: 'INPUT: iuxiuuuccidaueonyaraooolcycazuioeuuiauooaotzioaleosozoadeeuaiaezuoncczrsyeeszessycleaedaiuaydeceonoineiaatnouaaao'

Consultez ce lien pour trouver d'autres personnages "sosies" :

https://github.com/apache/lucene-solr/blob/1ca7067a810578d4e246b5434b9cdcec7145d230/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ASCIIFoldingFilter.java#L189

5voto

jpmottin Points 635

Parfois, la chaîne de caractères peut avoir une autre COLLATION, de sorte que vous avez toujours des accents dans le résultat. Dans ce cas, vous pouvez utiliser cette ligne ( basé sur cette solution ici ):

SELECT convert(varchar, your_string) COLLATE SQL_Latin1_General_Cp1251_CS_AS;

4voto

J'ai eu le même problème. En grec, pour une conversion correcte en UPPER(), vous devez supprimer l'accent. Changer la collation causait des problèmes dans d'autres applications. En mettant en place certaines fonctions REPLACE(), j'ai eu plus de contrôle sur le comportement du maintien de la collation. Voici mon ToUpperCaseGR fonction.

    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

0 votes

La collation ne fonctionne pas pour moi, mais celle-ci est à toute épreuve.

1voto

Esperento57 Points 8045

Utilisez cette fonction :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X