Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server - дефиниране на колона от тип XML с UTF-8 кодиране

Има ли начин да се дефинира колона/поле на SQL Server като с UTF-8 кодиране?

Не, единственото Unicode кодиране в SQL Server е UTF-16 Little Endian, което е как NCHAR , NVARCHAR , NTEXT (оттеглено от SQL Server 2005, така че не използвайте това в нова разработка; освен това е гадно в сравнение с NVARCHAR(MAX) така или иначе) и XML се обработват типове данни. Вие не получавате избор от Unicode кодиране, както позволяват някои други RDBMS.

Можете да вмъкнете кодиран с UTF-8 XML в SQL Server, при условие че следвате тези три правила:

  1. Входящият низ трябва да е от тип данни VARCHAR , а не NVARCHAR (като NVARCHAR винаги е UTF-16 Little Endian, оттук и грешката, че не може да се превключи кодирането).
  2. XML има XML декларация, която изрично посочва, че кодирането на XML наистина е UTF-8:<?xml version="1.0" encoding="UTF-8" ?> .
  3. Последователността от байтове трябва да бъде действителните UTF-8 байта.

Например, можем да импортираме кодиран в UTF-8 XML документ, съдържащ крещящото лице емоджи (и можем да получим UTF-8 байтовата последователност за този допълнителен символ, като следваме тази връзка):

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

Връща (в двата раздела „Резултати“ и „Съобщения“):

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

Споменахте в коментар за отговора на @Shnugo:

Не съм имал проблеми с вмъкването на кодирани в utf-8 потоци с utf-8 заглавка в колоната NVARCHAR на SQL Server 2013. Ще има ли скрит проблем?

Не, не сте съхранили нищо кодирано с UTF-8 в NVARCHAR колона (освен това няма версия 2013 на SQL Server, но това вероятно е просто печатна грешка). NVARCHAR е само UTF-16 Little Endian. Най-вероятно вашият UTF-8 поток е бил преобразуван в UTF-16 LE от драйвера на базата данни по време на преминаване към SQL Server. Това е същото кодиране, което XML колона би използвала, но XML колоната би се опитала да преобразува потока от UTF-8 в UTF-16, но не успя, тъй като вече е UTF-16. Това също означава, че на излизане от SQL Server, XML документът се съхранява в NVARCHAR В колоната все още ще има XML декларацията, в която се посочва, че кодирането е UTF-8, но определено не е UTF-8.

Ако абсолютно се нуждаете данните да бъдат UTF-8 на излизане, защото не искате да конвертирате UTF-16 LE, излизащ от SQL Server XML или NVARCHAR в UTF-8, тогава нямате друг избор, освен да съхранявате данните като VARBINARY(MAX) .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изпълнете командата Insert и върнете вмъкнат идентификатор в Sql

  2. Преобразувайте „datetimeoffset“ в „time“ в SQL Server (T-SQL примери)

  3. Лесното ръководство за това как да използвате подзаявки в SQL Server

  4. Как да коригирам състоянието на чакащо възстановяване в базата данни на SQL Server?

  5. Защо получавам грешката Типът данни Xml не се поддържа в разпределените заявки при запитване към свързан сървър за не-xml данни?