powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нечитаемые символы
7 сообщений из 7, страница 1 из 1
Нечитаемые символы
    #40127556
Диана Орел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в БД1 (Collation Cyrillic_General_CI_AS) есть таблица, в которой записаны строки на русском языке, но в таблице они отображаются некорректно. Вместо букв черный ромб с вопросом внутри

У меня есть сторонее ПО, которое берет данные из таблицы и перекладывает в текстовый файл, текстовый файл создает ПО. Кодировка файла UTF-8. В файле строки отображаются корректно на русском языке. Мне надо скопировать данные из таблицы в мою таблицу в БД2 (Collation Cyrillic_General_CI_AS) и в читабельном виде.
Как это сделать?
...
Рейтинг: 0 / 0
Нечитаемые символы
    #40127560
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диана Орел
но в таблице они отображаются некорректно


"В таблице" ничего не отображается.
Это ваше клиентское приложение "отображает".
Вот с ним и разбирайтесь.

ЗЫ. И Collation базы никакого смысла в данном контексте не несет.
Лучше DDL таблицы процитируйте.

Заодно и для таблицы процитируйте
Код: sql
1.
2.
3.
SELECT t.name TableName, c.name ColumnName, collation_name  
FROM sys.columns c  
inner join sys.tables t on c.object_id = t.object_id;
...
Рейтинг: 0 / 0
Нечитаемые символы
    #40127648
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диана Орел,

"Черный ромб" - это UTF-8. Нативно поддерживается сиквелом начиная с 2019 версии. Кстати, а у вас какая?

Для одноразового переливания я, наверное, по-быстрому набросал бы SSIS-пакет. Источник, получатель, и между ними конвертация столбца в нужный encoding / collation. Если в вашей базе столбец nvarchar, то в UTF-16, если varchar, то Windows_1251. Но это я, возможно есть и проще способы.
...
Рейтинг: 0 / 0
Нечитаемые символы
    #40127657
Диана Орел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

Смотрю таблицу в SSMS, не в стороннем ПО
Код: sql
1.
select account, accountx from dbo.tdataseg where loadid = 439



TableNameColumnNameCollationNameTypeTDATASEGACCOUNTCyrillic_General_CI_ASnvarchar(300)TDATASEGACCOUNTXCyrillic_General_CI_ASnvarchar(2000)

-- Это ваше клиентское приложение "отображает".
но все равно, символы отличаются от того, что у меня содержится в других таблицах:
я когда соединяю таблицу TDATASEG с таблицей справочника ACCOUNT, строки с нераспознанными символами в TDATASEG отваливаются. В таблице справочника ACCOUNT поле соединения тоже имеет Cyrillic_General_CI_AS, nvarchar(80)


Ennor Tiegael,
Microsoft SQL Server 2016 (SP3) (KB5003279) - 13.0.6300.2 (X64) Aug 7 2021 01:20:37 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor)
Нужно на постоянной основе, запросом INSERT
...
Рейтинг: 0 / 0
Нечитаемые символы
    #40127661
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диана Орел
aleks222,
Смотрю таблицу в SSMS, не в стороннем ПО

Ты не поверишь, но SSMS - это тоже клиентское приложение.

Диана Орел

TableNameColumnNameCollationNameTypeTDATASEGACCOUNTCyrillic_General_CI_ASnvarchar(300)TDATASEGACCOUNTXCyrillic_General_CI_ASnvarchar(2000)


-- Это ваше клиентское приложение "отображает".
но все равно, символы отличаются от того, что у меня содержится в других таблицах:
я когда соединяю таблицу TDATASEG с таблицей справочника ACCOUNT, строки с нераспознанными символами в TDATASEG отваливаются. В таблице справочника ACCOUNT поле соединения тоже имеет Cyrillic_General_CI_AS, nvarchar(80)

Для nvarchar коллейшн имеет символическое значение. Только сортировка и сравнение строк.
То, что nvarchar не "показывает" правильно - признак того, что там хранится НЕ nvarchar.

Диана Орел

Нужно на постоянной основе, запросом INSERT


На большие объемы это не пойдет, но попробовать можно.
Табличку dbo.N надо создать и номерками заполнить.
Можно, для теста, ограничиться 1..1000.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
-- 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)')
)



Код: sql
1.
2.
3.
select top(1) x.utf16, t.ACCOUNT
  from TDATASEG as t
          cross apply dbo.utf8-to-utf16( cast( ACCOUNT as varbinary(max) ) ) as x
...
Рейтинг: 0 / 0
Нечитаемые символы
    #40127664
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но что-то я не наблюдаю никаких ромбиков в utf8

Код: sql
1.
2.
declare @b as varbinary(max) = 0xD09CD0BED180D0B520D0A2D180D18DD0B2D0B5D0BB2E20D094D09ED09AD0A3D09CD095D09DD0A2D0AB20D094D09BD0AF20D09AD09BD098D095D09DD0A2D09020D0BFD0BE20D182D183D180D1832054523830393230303034;
select [char] = cast( @b as varchar(max)), [nchar] = cast( @b as nvarchar(max)), * from dbo.[utf8-to-utf16](@b)



char
Море Трэвел. ДОКУМЕНТЫ ДЛЯ КЛИЕНТА по туру TR80920004
nchar
鳐뻐胑뗐퀠톢톀킍킲킵⺻퀠킔킞킚킣킜킕킝킢₫铐鯐꿐퀠킚킛킘킕킝킢ₐ뿐뻐턠톂톃톀₃剔〸㈹〰㐰
utf16
Море Трэвел. ДОКУМЕНТЫ ДЛЯ КЛИЕНТА по туру TR80920004
...
Рейтинг: 0 / 0
Нечитаемые символы
    #40127781
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Но что-то я не наблюдаю никаких ромбиков в utf8

Код: sql
1.
2.
declare @b as varbinary(max) = 0xD09CD0BED180D0B520D0A2D180D18DD0B2D0B5D0BB2E20D094D09ED09AD0A3D09CD095D09DD0A2D0AB20D094D09BD0AF20D09AD09BD098D095D09DD0A2D09020D0BFD0BE20D182D183D180D1832054523830393230303034;
select [char] = cast( @b as varchar(max)), [nchar] = cast( @b as nvarchar(max)), * from dbo.[utf8-to-utf16](@b)



char
Море Трэвел. ДОКУМЕНТЫ ДЛЯ КЛИЕНТА по туру TR80920004
nchar
鳐뻐胑뗐퀠톢톀킍킲킵⺻퀠킔킞킚킣킜킕킝킢₫铐鯐꿐퀠킚킛킘킕킝킢ₐ뿐뻐턠톂톃톀₃剔〸㈹〰㐰
utf16
Море Трэвел. ДОКУМЕНТЫ ДЛЯ КЛИЕНТА по туру TR80920004


ну, во-первых, это красиво!
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нечитаемые символы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]