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

Откуда: Москва
Сообщений: 763
при записи в поле image данных в формате Base64 записался символ #0 осле каждых двух битов. Произошло из-за неверного преобразования данных в толстом клиенте.
т.е.:
записалось :
0x4A0056004200450052006900300078004C006A0051004B004A0065004C006A007A0039004D004B004E

а должно быть:
0x4A564245526930784C6A514B4A654C6A7A394D4B4E


как мне убрать эти нули запросом (sql 2008)?
2 сен 19, 13:04    [21961786]     Ответить | Цитировать Сообщить модератору
 Re: Исправление поля image  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
Не конвертировать в юникодную строку по дороге.
2 сен 19, 13:06    [21961788]     Ответить | Цитировать Сообщить модератору
 Re: Исправление поля image  [new]
Петр
Member

Откуда: Москва
Сообщений: 763
как исправить ошибку в толстом клиенте я знаю.
Как исправить уже созданные неверные строки в БД sql запросом?
2 сен 19, 13:11    [21961789]     Ответить | Цитировать Сообщить модератору
 Re: Исправление поля image  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
Петр,

однако, почему бы не изменить тип IMAGE на VARBINARY(MAX)?
2 сен 19, 13:12    [21961791]     Ответить | Цитировать Сообщить модератору
 Re: Исправление поля image  [new]
Петр
Member

Откуда: Москва
Сообщений: 763
и что дальше?
2 сен 19, 13:18    [21961792]     Ответить | Цитировать Сообщить модератору
 Re: Исправление поля image  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
Петр,

Приемрно так: достать из image и отконвертить varbinary -> nvarchar -> varchar -> varbinary -> image.
Но лучше сначала image в varbinary, как советуют.
2 сен 19, 13:20    [21961794]     Ответить | Цитировать Сообщить модератору
 Re: Исправление поля image  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
declare
    @bin varbinary (100) = 0x4A0056004200450052006900300078004C006A0051004B004A0065004C006A007A0039004D004B004E

select
    @bin
    ,  cast ( cast (  cast( @bin as nvarchar (100) ) as varchar (100) ) as varbinary (100) )  
2 сен 19, 13:22    [21961796]     Ответить | Цитировать Сообщить модератору
 Re: Исправление поля image  [new]
Петр
Member

Откуда: Москва
Сообщений: 763
да вроде получается
s4 = convert(image, convert(varbinary(max), convert(varchar(MAX), convert(nvarchar(MAX), convert(VARBINARY(MAX), fblob)))))


вопрос только в том хватит ли размера nvarchar(MAX)?
2 сен 19, 13:30    [21961800]     Ответить | Цитировать Сообщить модератору
 Re: Исправление поля image  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Петр
да вроде получается
s4 = convert(image, convert(varbinary(max), convert(varchar(MAX), convert(nvarchar(MAX), convert(VARBINARY(MAX), fblob)))))


вопрос только в том хватит ли размера nvarchar(MAX)?

2Гб?
2 сен 19, 13:33    [21961802]     Ответить | Цитировать Сообщить модератору
 Re: Исправление поля image  [new]
Петр
Member

Откуда: Москва
Сообщений: 763
TaPaK
Петр
да вроде получается
вопрос только в том хватит ли размера nvarchar(MAX)?

2Гб?


да 2 хватит.

Возникла следующая проблема. Сейчас в БД часть данных неверных, часть верных. Поидее преобразование не должно повлиять на верные данные. Но это по факту не так:

select 
fblob,
s = convert(VARBINARY(MAX), fblob), 
s1 = convert(nvarchar(MAX), convert(VARBINARY(MAX), fblob)), 
s2 = convert(varchar(MAX), convert(nvarchar(MAX), convert(VARBINARY(MAX), fblob))), 
s3 = convert(varbinary(max), convert(varchar(MAX), convert(nvarchar(MAX), convert(VARBINARY(MAX), fblob)))),
s4 = convert(image, convert(varbinary(max), convert(varchar(MAX), convert(nvarchar(MAX), convert(VARBINARY(MAX), fblob)))))


результат
2 сен 19, 13:45    [21961820]     Ответить | Цитировать Сообщить модератору
 Re: Исправление поля image  [new]
Петр
Member

Откуда: Москва
Сообщений: 763
полный результат
из-за чего это может быть?
2 сен 19, 13:51    [21961824]     Ответить | Цитировать Сообщить модератору
 Re: Исправление поля image  [new]
aleks222
Member

Откуда:
Сообщений: 846
Чо, не судьба проверить второй байт на 0 перед преобразованием?

ЗЫ. Можно ишо 3-й и 5-й байт проверить для вящей надежности...
2 сен 19, 14:32    [21961893]     Ответить | Цитировать Сообщить модератору
 Re: Исправление поля image  [new]
Петр
Member

Откуда: Москва
Сообщений: 763
aleks222
Чо, не судьба проверить второй байт на 0 перед преобразованием?

ЗЫ. Можно ишо 3-й и 5-й байт проверить для вящей надежности...


и как мне считать второй байт в sql?
2 сен 19, 15:55    [21961991]     Ответить | Цитировать Сообщить модератору
 Re: Исправление поля image  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Петр
aleks222
Чо, не судьба проверить второй байт на 0 перед преобразованием?

ЗЫ. Можно ишо 3-й и 5-й байт проверить для вящей надежности...


и как мне считать второй байт в sql?

Вы не поверите, через SUBSTRING.

declare
    @bin varbinary (100) = 0x4A0056004200450052006900300078004C006A0051004B004A0065004C006A007A0039004D004B004E

SELECT @bin
WHERE SUBSTRING(@bin, 2, 1) = 0x00 AND SUBSTRING(@bin, 4, 1) = 0x00
2 сен 19, 16:13    [21962009]     Ответить | Цитировать Сообщить модератору
 Re: Исправление поля image  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Minamoto
Петр
пропущено...


и как мне считать второй байт в sql?

Вы не поверите, через SUBSTRING.

declare
    @bin varbinary (100) = 0x4A0056004200450052006900300078004C006A0051004B004A0065004C006A007A0039004D004B004E

SELECT @bin
WHERE SUBSTRING(@bin, 2, 1) = 0x00 AND SUBSTRING(@bin, 4, 1) = 0x00

Для надежности можно все четные байты проверить:

CREATE TABLE #vb 
(
    c varbinary(100)
);

DECLARE
    @bin varbinary (100) = 0x4A0056004200450052006900300078004C006A0051004B004A0065004C006A007A0039004D004B004E

INSERT INTO #vb (c)
SELECT @bin 
UNION all
SELECT CAST ( cast (  cast( @bin as nvarchar (100) ) as varchar (100) ) as varbinary (100) )  


SELECT *
FROM #vb
WHERE 
    NOT EXISTS (
        SELECT 
            * 
        FROM 
            dbo.number
        WHERE 
            number < LEN(c) / 2 AND SUBSTRING(c, number * 2, 1) > 0x00
    )
2 сен 19, 16:21    [21962021]     Ответить | Цитировать Сообщить модератору
 Re: Исправление поля image  [new]
Петр
Member

Откуда: Москва
Сообщений: 763
спасибо всем за помощь.
2 сен 19, 16:52    [21962043]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить