sql >> Database >  >> RDS >> Sqlserver

SQL Server - definiëren van een XML-type kolom met UTF-8-codering

Is er een manier om een ​​SQL Server-kolom/-veld te definiëren met UTF-8-codering?

Nee, de enige Unicode-codering in SQL Server is UTF-16 Little Endian, en dat is hoe de NCHAR , NVARCHAR , NTEXT (verouderd vanaf SQL Server 2005, dus gebruik dit niet in nieuwe ontwikkeling; bovendien is het waardeloos vergeleken met NVARCHAR(MAX) hoe dan ook), en XML datatypes worden verwerkt. U krijgt geen keuze uit Unicode-coderingen zoals sommige andere RDBMS's toestaan.

U kunt UTF-8-gecodeerde XML in SQL Server invoegen, op voorwaarde dat u deze drie regels volgt:

  1. De inkomende string moet van het datatype VARCHAR . zijn , niet NVARCHAR (als NVARCHAR is altijd UTF-16 Little Endian, vandaar de fout dat de codering niet kan worden gewijzigd).
  2. De XML heeft een XML-declaratie die expliciet vermeldt dat de codering van de XML inderdaad UTF-8 is:<?xml version="1.0" encoding="UTF-8" ?> .
  3. De bytereeks moet de daadwerkelijke UTF-8 bytes zijn.

We kunnen bijvoorbeeld een UTF-8-gecodeerd XML-document importeren dat de emoji van het schreeuwende gezicht bevat (en we kunnen de UTF-8-bytereeks voor dat aanvullende teken krijgen door die link te volgen):

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);

Retouren (in zowel "Resultaten" als "Berichten" tabbladen):

<root><test>😱</test></root>

Je noemde in een reactie op het antwoord van @Shnugo:

Ik heb geen problemen gehad met het invoegen van utf-8-gecodeerde streams met utf-8-header in de SQL Server 2013 NVARCHAR-kolom. Zou er een verborgen probleem zijn?

Nee, je hebt niets met UTF-8-codering opgeslagen in een NVARCHAR kolom (bovendien is er geen 2013-versie van SQL Server, maar dat is waarschijnlijk gewoon een typfout). NVARCHAR is alleen ooit UTF-16 Little Endian. Hoogstwaarschijnlijk is uw UTF-8-stream tijdens de overdracht naar SQL Server door het databasestuurprogramma geconverteerd naar UTF-16 LE. Dit is dezelfde codering die een XML-kolom zou gebruiken, maar de XML-kolom zou geprobeerd hebben om de stream van UTF-8 naar UTF-16 te converteren, maar dit mislukte omdat het al UTF-16 was. Dit betekent ook dat bij het verlaten van SQL Server, het XML-document dat is opgeslagen in de NVARCHAR kolom zou nog steeds de XML-declaratie bevatten waarin staat dat de codering UTF-8 is, maar het is zeker geen UTF-8.

Als u op weg naar buiten absoluut de gegevens UTF-8 wilt hebben, omdat u de UTF-16 LE die uit SQL Server XML komt niet wilt converteren of NVARCHAR in UTF-8, dan heb je geen andere keuze dan de gegevens op te slaan als VARBINARY(MAX) .



  1. Hoe verklein ik mijn SQL Server-database?

  2. Tel het aantal records dat door groep is geretourneerd door

  3. InnoDB dwingen buitenlandse sleutels op een tafel/tabellen opnieuw te controleren?

  4. Functie voor datumnotatie in SQL Server