91 votes

Comment utiliser la collation 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 supporte pas utf8, est-ce une blague ?

Le serveur SQL héberge plusieurs bases de données, pour la plupart codées en latin. Comme la base de données migrée est destinée à la publication sur le web, je veux conserver l'encodage utf8. Ai-je manqué quelque chose ou dois-je encoder/décoder au niveau de l'application ?

36voto

Guffa Points 308133

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, vous devez utiliser la fonction nvarchar type de données.

Si la base de données utilisait UTF-8 pour stocker le texte, vous n'obtiendriez toujours pas le texte sous forme de données UTF-8 codées, mais sous forme de texte décodé.

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

27voto

edze Points 2004

Non ! Ce n'est pas une blague.

Jetez un coup d'œil ici : http://msdn.microsoft.com/en-us/library/ms186939.aspx

C de longueur variable, nvarchar, des données Unicode et utilisent le jeu de caractères UNICODE UCS-2 d'UNICODE.

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

T similaire qui a été remplacé par l'UTF-16 dans la version 2.0 de la norme norme Unicode en juillet 1996.

27voto

Bartosz X Points 1317

Il semble que cela sera finalement pris en charge dans le serveur SQL 2019 ! SQL Server 2019 - quelles sont les nouveautés ?

De BOL :

Support UTF-8

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

Par exemple, LATIN1_GENERAL_100_CI_AS_SC t LATIN1_GENERAL_100_CI_AS_SC_UTF8 . UTF-8 n'est disponible que pour Windows qui prennent en charge les caractères supplémentaires, comme cela a été introduit dans SQL Server 2012. NCHAR y NVARCHAR n'autorisent que l'encodage UTF-16, et demeurent inchangés.

Cette fonctionnalité peut permettre de réaliser des économies de stockage significatives, en fonction de la capacité du jeu de caractères utilisé. Par exemple, la modification d'une colonne existante avec des chaînes de caractères ASCII de NCHAR(10) a CHAR(10) u se traduit par une réduction de près de 50 % des besoins de stockage. de stockage. Cette réduction est due au fait que NCHAR(10) r pour le stockage, alors que CHAR(10) r Unicode.

Mise à jour du 14 mai 2019 :

La documentation semble avoir été mise à jour maintenant et explique nos options en regardant dans MSSQL 2019 dans la section " Collation et support Unicode ".

Mise à jour de 2019-07-24 :

Article par Pedro Lopes - Directeur de programme senior chez Microsoft à propos de l'introduction du support UTF-8 pour Azure SQL Database

7voto

Xabi Points 79

Deux UDF pour traiter l'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

4voto

Charles Burns Points 3745

Notez qu'à partir de Microsoft SQL Server 2016, UTF-8 est pris en charge par le système de gestion de l'information. bcp , BULK_INSERT y OPENROWSET .

Addendum 2016-12-21 : SQL Server 2016 SP1 permet désormais la compression Unicode (et la plupart des autres fonctionnalités précédemment réservées aux entreprises) 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 donne un avantage similaire si l'objectif est la réduction de l'espace disque pour les alphabets occidentaux.

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