Ich habe eine Datenbank von MySQL auf SQL Server (Politik) migriert, die ursprüngliche MySQL-Datenbank mit UTF8.
Jetzt habe ich /dba/7346/sql-server-2005-2008-utf-8-collation-charset gelesen, dass SQL Server 2008 utf8 nicht unterstützt. Ist das ein Witz?
Der SQL Server hostet mehrere Datenbanken, die größtenteils lateinisch codiert sind. Da die migrierte Datenbank für das Web-Publishing vorgesehen ist, möchte ich die utf8-Codierung beibehalten. Habe ich etwas verpasst oder muss ich auf Anwendungsebene enc / dec?
sql-server
utf-8
Teson
quelle
quelle
Antworten:
Nein! Es ist kein Witz.
Schauen Sie hier: http://msdn.microsoft.com/en-us/library/ms186939.aspx
Und auch hier: http://en.wikipedia.org/wiki/UTF-16
quelle
mssql-client
kann alles sein. Java, .NET, C, PHP usw. Was bedeutet Client?UTF-8 ist kein Zeichensatz, sondern eine Codierung. Der Zeichensatz für UTF-8 ist Unicode. Wenn Sie Unicode-Text speichern möchten, verwenden Sie den
nvarchar
Datentyp.Wenn die Datenbank UTF-8 zum Speichern von Text verwenden würde, würden Sie den Text immer noch nicht als codierte UTF-8-Daten ausgeben, sondern als decodierten Text.
Sie können UTF-8-codierten Text problemlos in der Datenbank speichern, aber dann speichern Sie ihn nicht als Text, sondern als Binärdaten (
varbinary
).quelle
110xxxxx 10xxxxxx
in UTF-8 (wobei Datenbits dargestellt werden) codiertx
, sodass der ZeichencodeF0
(00011110000
als 11 Bit) als11000011 10110000
(00011
aus dem Zeichencode im ersten Byte und110000
im zweiten Byte ) codiert wird ) was istC3 B0
.Sieht so aus, als würde dies endlich in SQL Server 2019 unterstützt! SQL Server 2019 - was ist neu?
Update 2019-05-14:
Die Dokumentation scheint jetzt aktualisiert zu sein und erläutert unsere Optionen für MSSQL 2019 im Abschnitt " Kollatierungs- und Unicode-Unterstützung ".
Update 2019-07-24:
Artikel von Pedro Lopes - Senior Program Manager bei Microsoft über die Einführung der UTF-8-Unterstützung für die Azure SQL-Datenbank
quelle
Beachten Sie, dass wie von Microsoft SQL Server 2016, UTF-8 unterstützt wird
bcp
,BULK_INSERT
undOPENROWSET
.Nachtrag 21.12.2016: SQL Server 2016 SP1 aktiviert jetzt die Unicode-Komprimierung (und die meisten anderen Funktionen, die bisher nur für Unternehmen verfügbar waren) für alle Versionen von MS SQL, einschließlich Standard und Express. Dies ist nicht dasselbe wie die UTF-8-Unterstützung, bietet jedoch einen ähnlichen Vorteil, wenn das Ziel die Reduzierung des Speicherplatzes für westliche Alphabete ist.
quelle
Zwei UDF für UTF-8 in 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
quelle