Finns det något sätt att definiera en SQL Server-kolumn/-fält som med UTF-8-kodning?
Nej, den enda Unicode-kodningen i SQL Server är UTF-16 Little Endian, vilket är hur NCHAR
, NVARCHAR
, NTEXT
(utfasad från och med SQL Server 2005 så använd inte detta i nyutveckling; dessutom suger det jämfört med NVARCHAR(MAX)
i alla fall), och XML
datatyper hanteras. Du får inte ett val av Unicode-kodningar som vissa andra RDBMS tillåter.
Du kan infoga UTF-8-kodad XML i SQL Server, förutsatt att du följer dessa tre regler:
- Den inkommande strängen måste vara av datatypen
VARCHAR
, inteNVARCHAR
(somNVARCHAR
är alltid UTF-16 Little Endian, därav felet om att inte kunna byta kodning). - XML har en XML-deklaration som uttryckligen anger att kodningen av XML verkligen är UTF-8:
<?xml version="1.0" encoding="UTF-8" ?>
. - Bytesekvensen måste vara den faktiska UTF-8-byten.
Till exempel kan vi importera ett UTF-8-kodat XML-dokument som innehåller den skrikande ansikte-emojien (och vi kan få UTF-8-bytesekvensen för den tilläggstecken genom att följa den länken):
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);
Returnerar (på både flikarna "Resultat" och "Meddelanden"):
<root><test>😱</test></root>
Du nämnde i en kommentar till @Shnugos svar:
Jag har inte haft några problem med att infoga utf-8-kodade strömmar med utf-8 header i SQL Server 2013 NVARCHAR-kolumnen. Skulle det finnas ett dolt problem?
Nej, du lagrade inget UTF-8-kodat i en NVARCHAR
kolumn (dessutom finns det ingen 2013-version av SQL Server, men det är förmodligen bara ett stavfel). NVARCHAR
är bara någonsin UTF-16 Little Endian. Troligtvis konverterades din UTF-8-ström till UTF-16 LE av databasdrivrutinen under överföringen till SQL Server. Detta är samma kodning som en XML-kolumn skulle använda, men XML-kolumnen skulle ha försökt konvertera strömmen från UTF-8 till UTF-16 men misslyckades på grund av att den redan är UTF-16. Detta betyder också att XML-dokumentet lagrat i NVARCHAR
på väg ut från SQL Server. kolumnen skulle fortfarande ha XML-deklarationen som anger att kodningen är UTF-8, men det är definitivt inte UTF-8.
Om du absolut behöver att data är UTF-8 på väg ut eftersom du inte vill konvertera UTF-16 LE som kommer ut från SQL Server XML
eller NVARCHAR
till UTF-8, då har du inget annat val än att lagra data som VARBINARY(MAX)
.