Er der en måde at definere en SQL Server-kolonne/-felt som havende UTF-8-kodning?
Nej, den eneste Unicode-kodning i SQL Server er UTF-16 Little Endian, hvilket er hvordan NCHAR
, NVARCHAR
, NTEXT
(forældet fra SQL Server 2005, så brug ikke dette i nyudvikling; desuden er det ærgerligt sammenlignet med NVARCHAR(MAX)
alligevel), og XML
datatyper håndteres. Du får ikke et valg af Unicode-kodninger, som nogle andre RDBMS'er tillader.
Du kan indsætte UTF-8-kodet XML i SQL Server, forudsat at du følger disse tre regler:
- Den indgående streng skal være af datatypen
VARCHAR
, ikkeNVARCHAR
(somNVARCHAR
er altid UTF-16 Little Endian, deraf fejlen om ikke at kunne skifte kodning). - XML'et har en XML-erklæring, der udtrykkeligt angiver, at kodningen af XML'en faktisk er UTF-8:
<?xml version="1.0" encoding="UTF-8" ?>
. - Bytesekvensen skal være de faktiske UTF-8-bytes.
For eksempel kan vi importere et UTF-8-kodet XML-dokument, der indeholder den skrigende ansigt-emoji (og vi kan få UTF-8-bytesekvensen for det supplerende tegn ved at følge det link):
SET NOCOUNT ON;
DECLARE @XML XML = '<?xml version="1.0" encoding="utf-8"?><root><test>'
+ CHAR(0xF0) + CHAR(0x9F) + CHAR(0x98) + CHAR(0xB1)
+ '</test></root>';
SELECT @XML;
PRINT CONVERT(NVARCHAR(MAX), @XML);
Returnerer (i både "Resultater" og "Beskeder" faner):
<root><test>😱</test></root>
Du nævnte i en kommentar til @Shnugos svar:
Jeg har ikke haft problemer med at indsætte utf-8-kodede streams med utf-8 header i SQL Server 2013 NVARCHAR-kolonnen. Ville der være et skjult problem?
Nej, du har ikke gemt UTF-8-kodet noget i en NVARCHAR
kolonne (derudover er der ingen 2013-version af SQL Server, men det er nok bare en tastefejl). NVARCHAR
er kun nogensinde UTF-16 Little Endian. Mest sandsynligt blev din UTF-8-stream konverteret til UTF-16 LE af databasedriveren under overførsel til SQL Server. Dette er den samme kodning, som en XML-kolonne ville bruge, men XML-kolonnen ville have forsøgt at konvertere strømmen fra UTF-8 til UTF-16, men mislykkedes, fordi den allerede er UTF-16. Dette betyder også, at XML-dokumentet, der er gemt i NVARCHAR
på vej ud af SQL Server. kolonnen vil stadig have XML-erklæringen, der angiver, at kodningen er UTF-8, men det er bestemt ikke UTF-8.
Hvis du absolut har brug for, at dataene er UTF-8 på vej ud, fordi du ikke ønsker at konvertere UTF-16 LE, der kommer ud af SQL Server XML
eller NVARCHAR
i UTF-8, så har du intet andet valg end at gemme dataene som VARBINARY(MAX)
.