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?
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.
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
).
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
etVARCHAR
et est activé lors de la création ou de la modification de la collation d'un objet en une collation avec le suffixeUTF8
.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
etNVARCHAR
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 queNCHAR(10)
nécessite 22 octets pour le stockage, alors queCHAR(10)
nécessite 12 octets pour le même Unicode chaîne.
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.
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
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
https://cloudblogs.Microsoft.com/sqlserver/2018/12/18/introducing-utf-8-support-in-sql-server-2019-preview/ maintenant jours Uft-8 pris en charge à mssql 2019.