Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Bulk Insert и UTF-8  [new]
Dm13_13
Member

Откуда:
Сообщений: 3
Добрый день! есть csv файл, генерируемый Crystal Report, который должен втавляться в sql базу c помощью bulk insert. Проблема в том, что csv файл в UTF-8, который, как я понимаю, распознается только SQL Server 2014SP и выше, а у нас 2012 SP4, поэтому вместо русских символов получается каша.

Есть ли способ обойти это с помощью SQL или надо копать в сторону смены кодировки файла, формируемого Crystal Report?

Спасибо
27 окт 18, 18:55    [21716936]     Ответить | Цитировать Сообщить модератору
 Re: Bulk Insert и UTF-8  [new]
Massa52
Member

Откуда:
Сообщений: 379
Dm13_13,
Без проблем UTF-8 загоняется в любой SQL.
28 окт 18, 02:37    [21717095]     Ответить | Цитировать Сообщить модератору
 Re: Bulk Insert и UTF-8  [new]
Dm13_13
Member

Откуда:
Сообщений: 3
Massa52,

при выполнении

SELECT @sql =
'BULK INSERT tbl_test FROM ''c:\tmp\msg.csv''
WITH (FIRSTROW = 1, FIELDTERMINATOR = '';'',
CODEPAGE=''ACP'',
ROWTERMINATOR = ''' + nchar(10) + ''')'
EXEC(@sql)


вместо русских символов вставляются кракозямбы
28 окт 18, 09:24    [21717124]     Ответить | Цитировать Сообщить модератору
 Re: Bulk Insert и UTF-8  [new]
aleks222
Member

Откуда:
Сообщений: 983
Massa52
Dm13_13,
Без проблем UTF-8 загоняется в любой SQL.

С этого места поподробнее!
Я записываю!!!
28 окт 18, 10:09    [21717129]     Ответить | Цитировать Сообщить модератору
 Re: Bulk Insert и UTF-8  [new]
Massa52
Member

Откуда:
Сообщений: 379
Dm13_13,
https://www.sql.ru/forum/1022040/bulk-insert-ne-ponimaet-utf-8
Может bcp вас устроит?
28 окт 18, 10:55    [21717139]     Ответить | Цитировать Сообщить модератору
 Re: Bulk Insert и UTF-8  [new]
Massa52
Member

Откуда:
Сообщений: 379
aleks222,
Облом однако. Я вроде загонял кажись с помощью bcp - я уже и в этом сомневаюсь.
Тут нашел советы как с помощью форматного файла загнать можно - но повторить не получилось.
https://blogs.technet.microsoft.com/isv_team/2011/08/20/bulk-insert/
28 окт 18, 11:49    [21717155]     Ответить | Цитировать Сообщить модератору
 Re: Bulk Insert и UTF-8  [new]
Massa52
Member

Откуда:
Сообщений: 379
Что интересно - при сохранении текстового файла в OEM 866 кодовой страницы
кирилица нормально проходит.

col1 col2 col3
ЄхёЄ1 ЄхёЄ2 ЄхёЄ3 windows-1251
тест1 тест2 тест3 oem-866
28 окт 18, 12:09    [21717164]     Ответить | Цитировать Сообщить модератору
 Re: Bulk Insert и UTF-8  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3251
Dm13_13
Проблема в том, что csv файл в UTF-8, который, как я понимаю, распознается только SQL Server 2014SP и выше
Начиная с 2016, если быть точным.

В вашем случае я бы попробовал SSIS, у него с этим проблем нет. Можно, конечно, написать и самодельный конвертер - десяток строк на C#, вряд ли больше. Ну или CLR на нем же.
28 окт 18, 12:31    [21717169]     Ответить | Цитировать Сообщить модератору
 Re: Bulk Insert и UTF-8  [new]
aleks222
Member

Откуда:
Сообщений: 983
Ennor Tiegael
Можно, конечно, написать и самодельный конвертер - десяток строк на C#, вряд ли больше. Ну или CLR на нем же.


2 (две) строки на PowerShell.
28 окт 18, 13:20    [21717193]     Ответить | Цитировать Сообщить модератору
 Re: Bulk Insert и UTF-8  [new]
aleks222
Member

Откуда:
Сообщений: 983
Впрочем, если не слишком много - MS SQL сам могет

-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	Преобразование utf8 в utf16 (nchar)
-- =============================================
/* 
declare @b as varbinary(max) = 0xD09CD0BED180D0B520D0A2D180D18DD0B2D0B5D0BB2E20D094D09ED09AD0A3D09CD095D09DD0A2D0AB20D094D09BD0AF20D09AD09BD098D095D09DD0A2D09020D0BFD0BE20D182D183D180D1832054523830393230303034;
select * from dbo.[utf8-to-utf16](@b)
*/
ALTER FUNCTION [dbo].[utf8-to-utf16]( @utf8 varbinary(max) )
RETURNS TABLE 
AS
RETURN 
(
with b as ( select b = substring(@utf8, n, 1), n from dbo.N where n between 1 and len(@utf8) )
   , bn as ( select b, n from b where b&128 = 0 or b&224 = 192 or b&240 = 224 or b&248 = 240 )
   , chs as ( select b = case  
                            when b&128 = 0   then      b 
                            when b&224 = 192 then     (b&31) * 64 | ( substring(@utf8, n+1, 1) & 63 ) 
                            when b&240 = 224 then   ( (b&15) * 64 | ( substring(@utf8, n+1, 1) & 63 ) ) * 64 | ( substring(@utf8, n+2, 1) & 63 ) 
                            else                  ( ( (b&07) * 64 | ( substring(@utf8, n+1, 1) & 63 ) ) * 64 | ( substring(@utf8, n+2, 1) & 63 ) ) * 64 | ( substring(@utf8, n+3, 1) & 63 ) 
                         end
                   , n
               from bn
           )
    select utf16 = ( select nchar(b) from chs order by n asc for xml path(''), type ).value('.', 'nvarchar(max)')
)
28 окт 18, 13:26    [21717200]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить