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