sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server - definerer en XML-type kolonne med UTF-8-kodning

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:

  1. Den indgående streng skal være af datatypen VARCHAR , ikke NVARCHAR (som NVARCHAR er altid UTF-16 Little Endian, deraf fejlen om ikke at kunne skifte kodning).
  2. 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" ?> .
  3. 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) .



  1. Oracle-forespørgsel for at hente kolonnenavne

  2. Hvordan CONVERT_TZ() virker i MariaDB

  3. Når du bruger GETDATE() mange steder, er det så bedre at bruge en variabel?

  4. Sammenlign arrays for lighed, ignorer rækkefølgen af ​​elementer