sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server - definierar en XML-typkolumn med UTF-8-kodning

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:

  1. Den inkommande strängen måste vara av datatypen VARCHAR , inte NVARCHAR (som NVARCHAR är alltid UTF-16 Little Endian, därav felet om att inte kunna byta kodning).
  2. XML har en XML-deklaration som uttryckligen anger att kodningen av XML verkligen är UTF-8:<?xml version="1.0" encoding="UTF-8" ?> .
  3. 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) .



  1. AWS Python Lambda med Oracle

  2. Kan du komma åt värdet för automatisk inkrement i MySQL inom ett uttalande?

  3. Databas som kan hantera>500 miljoner rader

  4. lagra arabiska i SQL-databas