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:
- De inkomende string moet van het datatype
VARCHAR
. zijn , nietNVARCHAR
(alsNVARCHAR
is altijd UTF-16 Little Endian, vandaar de fout dat de codering niet kan worden gewijzigd). - 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" ?>
. - 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)
.