web-dev-qa-db-fra.com

Comment utiliser le classement UTF-8 dans une base de données SQL Server?

J'ai migré une base de données de mysql vers SQL Server (politique), la base de données mysql originale utilisant UTF8.

Maintenant, je lis https://dba.stackexchange.com/questions/7346/sql-server-2005-2008-utf-8-collation-charset que SQL Server 2008 ne prend pas en charge utf8, est-ce une blague ?

SQL Server héberge plusieurs bases de données, principalement codées en latin. La base de données migrée étant destinée à la publication Web, je souhaite conserver le codage utf8. Ai-je oublié quelque chose ou dois-je enc/dec au niveau de l'application?

63
Teson

Non! Ce n'est pas une blague.

Jetez un oeil ici: http://msdn.Microsoft.com/en-us/library/ms186939.aspx

Types de données de caractère de longueur fixe, nchar ou données Unicode de longueur variable, nvarchar et utilisez l’UNICODE UCS-2 jeu de caractères.

Et aussi ici: http://en.wikipedia.org/wiki/UTF-16

L'ancien UCS-2 (jeu de caractères universel de 2 octets) est similaire codage de caractères qui a été remplacé par UTF-16 dans la version 2.0 du Standard Unicode en juillet 1996.

15
edze

UTF-8 n'est pas un jeu de caractères, c'est un encodage. Le jeu de caractères pour UTF-8 est Unicode. Si vous souhaitez stocker du texte Unicode, utilisez le type de données nvarchar.

Si la base de données utilise le format UTF-8 pour stocker du texte, vous ne pourrez toujours pas extraire le texte sous forme de données UTF-8 codées, mais le texte décodé.

Vous pouvez facilement stocker du texte codé UTF-8 dans la base de données, mais vous ne le stockez pas sous forme de texte, mais sous forme de données binaires (varbinary).

16
Guffa

On dirait que cela sera finalement pris en charge dans SQL Server 2019! SQL Server 2019 - quoi de neuf?

De BOL:

Support UTF-8

Prise en charge complète du codage de caractères UTF-8 largement utilisé en tant qu’importation ou encodage d'exportation, ou en tant que classement au niveau de la base de données ou de la colonne pour données textuelles. UTF-8 est autorisé dans les types de données CHAR et VARCHAR et est activé lors de la création ou de la modification de la collation d'un objet en une collation avec le suffixe UTF8.

Par exemple, LATIN1_GENERAL_100_CI_AS_SC à LATIN1_GENERAL_100_CI_AS_SC_UTF8. UTF-8 est uniquement disponible pour Windows des classements qui prennent en charge des caractères supplémentaires, tels que introduits dans SQL Server 2012. NCHAR et NVARCHAR autorisent uniquement le codage UTF-16 et restent inchangé.

Cette fonctionnalité peut permettre des économies de stockage importantes, en fonction du fichier jeu de caractères en cours d'utilisation. Par exemple, modifier une donnée de colonne existante tapez avec les chaînes ASCII de NCHAR(10) à CHAR(10) à l'aide d'un fichier UTF-8 le classement activé, se traduit par une réduction de près de 50% de la capacité de stockage exigences. Cette réduction est due au fait que NCHAR(10) nécessite 22 octets pour le stockage, alors que CHAR(10) nécessite 12 octets pour le même Unicode chaîne.

6
Bartosz X

Notez qu'à partir de Microsoft SQL Server 2016, UTF-8 est pris en charge par bcp , BULK_INSERT et OPENROWSET .

Addendum 2016-12-21: SQL Server 2016 SP1 active désormais la compression Unicode (et la plupart des fonctionnalités précédemment réservées à l'entreprise) pour toutes les versions de MS SQL, y compris Standard et Express. Ce n'est pas la même chose que le support UTF-8, mais cela procure un avantage similaire si l'objectif est de réduire l'espace disque pour les alphabets occidentaux.

4
Charles Burns

Deux UDF pour gérer UTF-8 dans T-SQL:

CREATE Function UcsToUtf8(@src nvarchar(MAX)) returns varchar(MAX) as
begin
    declare @res varchar(MAX)='', @pi char(8)='%[^'+char(0)+'-'+char(127)+']%', @i int, @j int
    select @i=patindex(@pi,@src collate Latin1_General_BIN)
    while @i>0
    begin
        select @j=unicode(substring(@src,@i,1))
        if @j<0x800     select @res=@res+left(@src,@i-1)+char((@j&1984)/64+192)+char((@j&63)+128)
        else            select @res=@res+left(@src,@i-1)+char((@j&61440)/4096+224)+char((@j&4032)/64+128)+char((@j&63)+128)
        select @src=substring(@src,@i+1,datalength(@src)-1), @i=patindex(@pi,@src collate Latin1_General_BIN)
    end
    select @res=@res+@src
    return @res
end

CREATE Function Utf8ToUcs(@src varchar(MAX)) returns nvarchar(MAX) as
begin
    declare @i int, @res nvarchar(MAX)=@src, @pi varchar(18)
    select @pi='%[à-ï][€-¿][€-¿]%',@i=patindex(@pi,@src collate Latin1_General_BIN)
    while @i>0 select @res=stuff(@res,@i,3,nchar(((ascii(substring(@src,@i,1))&31)*4096)+((ascii(substring(@src,@i+1,1))&63)*64)+(ascii(substring(@src,@i+2,1))&63))), @src=stuff(@src,@i,3,'.'), @i=patindex(@pi,@src collate Latin1_General_BIN)
    select @pi='%[Â-ß][€-¿]%',@i=patindex(@pi,@src collate Latin1_General_BIN)
    while @i>0 select @res=stuff(@res,@i,2,nchar(((ascii(substring(@src,@i,1))&31)*64)+(ascii(substring(@src,@i+1,1))&63))), @src=stuff(@src,@i,2,'.'),@i=patindex(@pi,@src collate Latin1_General_BIN)
    return @res
end
1
Xabi

En réalité, l'utilisation de UTF8 ne pose aucun problème en créant SQLCLR UDF et vous pouvez télécharger le code chez Microsoft. Vérifiez ce lien: http://technet.Microsoft.com/en-us/library/ms160893(v=sql.90).aspx

1
Ronen Ariely
0
arnav