Как загрузить CSV-файлы UTF-8 с помощью групповой вставки и файла формата XML в SQL Server 2017 - PullRequest
0 голосов
/ 09 октября 2018

После долгих попыток я обнаружил, что с SQL server 2017 (2016?) Загрузка CSV-файлов в кодировке UTF-8 через групповую вставку стала возможной благодаря использованию опций CODEPAGE = 65001 и DATAFILETYPE = 'Char', как объяснено в некоторых другихВопросы.

То, что не работает, делает то же самое при использовании файла формата XML.Я попробовал это, все еще используя опции CODEPAGE и DATAFILETYPE, а также с этими опущенными опциями.И я попробовал это с самым простым набором данных.Одна строка, один столбец, содержащий некоторый текст с символом UTF-8.

Это файл формата XML, который я использую.

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RECORD>
  <FIELD ID="STREET" xsi:type="NCharTerm" TERMINATOR="\r\n" MAX_LENGTH="1000" COLLATION="Latin1_General_CS_AS_WS"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="STREET" NAME="STREET" xsi:type="SQLNVARCHAR"/>
 </ROW>
</BCPFORMAT>

Даже через исходные данные содержится только некоторый текст с1 специальный символ, конечный результат выглядит следующим образом: 慊潫ⵢ瑓晥慦⵮瑓慲鿃⁳㐱 При использовании xsi:type="CharTerm" вместо xsi:type="NCharTerm" результат выглядит следующим образом: ... -Straßs ...

Я что-то не так делаюили поддержка UTF-8 неправильно реализована для файлов формата XML?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Поиграв с этим, я нашел решение.

Примечания

  • Работает с заголовком спецификации или без него.Это не имеет значения.
  • Преступник использовал параметр COLLATION в файле XML.Отказ от этого решил проблему кодирования.У меня есть интуитивное понимание того, почему это так, но, возможно, кто-то с большим пониманием мог бы объяснить в комментариях ...
  • Опция DATAFILETYPE = 'char' не кажется необходимой.
  • В XML-файле xsi:type для поля должно быть CharTerm, , а не NCharTerm.
  • Это работает с \ r \ n, \ n или \ r.Пока вы правильно установите TERMINATOR, это работает.Никаких изменений \ n \ 0 не требуется (это даже нарушит функциональность, поскольку это не UTF-16 или UCS-2).

Ниже вы можете найти подтверждение концепции для легкого повторного использования...

data.txt

ß
ß
ß

Таблица

CREATE TABLE [dbo].[TEST](
    TEST [nvarchar](500) NULL
)

formatfile.xml

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RECORD>
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="20"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="TEST" xsi:type="SQLNVARCHAR"/>
 </ROW>
</BCPFORMAT>

Массовая вставка

    bulk insert TEST..TEST
    from 'data.txt'
    with (formatfile = 'formatfile.xml', CODEPAGE = 65001)
0 голосов
/ 09 октября 2018

Измените свой терминатор на TERMINATOR="\r\0\n\0".Вы должны учитывать дополнительные байты при использовании NCharTerm.

...