Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 помогите разобраться с collation  [new]
хмхмхм
Guest
Есть две бд, в обоих collation: Cyrillic_General_CI_AI

В одной базе данных хранится текстовый файл в поле varchar(max) (collate не прописан) в формате base64.
Задача его раскодировать, заменить некоторые фразы, закодировать в varbinary(max) и отдать во внешнее приложение при помощи select.

Так вот, когда я кодирую английские символы, то все нормально, но когда встречаются русские, то выходят кракозябры:

"Номер вашей карты"


Кодирую в varchar(max) таким образом:

select
cast(File_data AS VARCHAR(MAX))
from(
select CAST(N'' AS XML).value(
        'xs:base64Binary(sql:column("DocumentBody"))'
      , 'VARBINARY(MAX)') AS [File_data]
from [Table]
)t


И уже здесь русские символы не читаются.

Помогите пожалуйста с преобразованием.
28 ноя 13, 10:39    [15203853]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с collation  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
хмхмхм,

Потому что кодируете, судя по всему, в UTF-8, а сиквел его не воспринимает.
28 ноя 13, 10:40    [15203872]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с collation  [new]
хмхмх
Guest
Ennor Tiegael,

а из UTF-8 можно преобразовать в Cyrillic_general_ci_as?
28 ноя 13, 10:42    [15203884]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с collation  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
хмхмх,

Я как-то делал, на SQL. Там не очень сложный алгоритм, мне википедии хватило. Правда, после того как я вычистил из него все баги, голову пришлось лечить два дня.

Только вы бы лучше привели пример реальных данных, что у вас там на самом деле сидит в этом XML. А то, может, это гораздо проще лечится.
28 ноя 13, 10:47    [15203926]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с collation  [new]
хмхмхм
Guest
Ennor Tiegael,

Вот пример строки в файле в кодировке UTF-8:
"label": "Номер вашей карты",


Этот файл помещается в таблицу в формате base64, затем, когда я его конвертирую в varchar(max) через varbinary(max) выходит вот такая строка:

"label": "Номер вашей карты",


Это реальный пример из файла, который посылается в бд.
28 ноя 13, 10:53    [15203964]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с collation  [new]
Glory
Member

Откуда:
Сообщений: 104760
хмхмхм
когда я его конвертирую в varchar(max) через varbinary(max) выходит вот такая строка:

А придется еще и перекодировать самостоятельно
28 ноя 13, 10:58    [15203996]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с collation  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
хмхмхм
Вот пример строки в файле в кодировке UTF-8:
"label": "Номер вашей карты",
Это то, что у вас в файле, а я просил, как именно это выглядит в базе в том поле, на которое вы натравливаете метод value() - оно у вас бинарное, я так понимаю? Ибо могут быть нюансы.

Нормальное репро дайте.
28 ноя 13, 11:01    [15204022]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с collation  [new]
хмхмхм
Guest
Ennor Tiegael,

Таблица, в которой хранятся файлы в base64:
CREATE TABLE [dbo].[Documents](
	[ID] [uniqueidentifier] not NULL,
	[MimeType] [nvarchar](256) NULL,
	[DocumentBody] [varchar](max) null
 CONSTRAINT [ndx_PrimaryKey] PRIMARY KEY NONCLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO


Запрос конвертации данных:
select
cast(File_data AS VARCHAR(MAX))
from(
select CAST(N'' AS XML).value(
        'xs:base64Binary(sql:column("DocumentBody"))'
      , 'VARBINARY(MAX)') AS [File_data]
from dbo.Documents
)t


В таблице это поле выглядит так:
select DocumentBody from dbo.Documents


DocumentBody
-------------------
ImxhYmVsIjogItCj0YDQvtCy0LXQvdGMINC60LDRgNGC0YsiLA==
28 ноя 13, 11:17    [15204172]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с collation  [new]
хмхмхм
Guest
Collation базы данных:

Cyrillic_General_CI_AI
28 ноя 13, 11:18    [15204192]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с collation  [new]
Glory
Member

Откуда:
Сообщений: 104760
Т.е. вы в [DocumentBody] [varchar](max) загурузили unicode файл в кодировке UTF-8 и теперь хотите что сервер вам преобразовал это в читаемый текст ???
28 ноя 13, 11:21    [15204229]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с collation  [new]
Клон деды
Member

Откуда:
Сообщений: 6904
хмхмхм,

Попробуйте вместо varbinary использовать varchar
28 ноя 13, 11:22    [15204239]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с collation  [new]
хмхмхм
Guest
Glory,

я не хочу того, что вы пишите.
я хочу понять можно ли это конвертировать в текст, что-то в нем заменить и отдать как varbinary(max), вот и все.

При этом английские символы распознаются нормально, проблема в воспроизведении кириллицы.
28 ноя 13, 11:24    [15204262]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с collation  [new]
pio777
Member

Откуда:
Сообщений: 127
хмхмхм,

Так вы попробовали изпользовать nvarchar?
28 ноя 13, 12:48    [15205206]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с collation  [new]
хмхмхм
Guest
pio777,

пробовал:
氢扡汥㨢∠ꏐ胑뻐닐뗐뷐賑퀠킺톰톀톂⊋,
28 ноя 13, 12:52    [15205259]     Ответить | Цитировать Сообщить модератору
 Re: помогите разобраться с collation  [new]
Glory
Member

Откуда:
Сообщений: 104760
хмхмхм
я хочу понять можно ли это конвертировать в текст, что-то в нем заменить и отдать как varbinary(max), вот и все.

Так и надо было загружать как varbinary(max).
И заменять байты на байты без всякого конвертирования.
28 ноя 13, 12:57    [15205316]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить