powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Данные типа BINARY
12 сообщений из 12, страница 1 из 1
Данные типа BINARY
    #32057509
kimkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кто может объяснить следующую ситуацию :

В Таблице А есть поле типа binary длиной 5
Сидит в нем значение 'ТОТ'
Выполняю
declare @p varchar(100)
select @p = cast(vchAddition as varchar(5)) from А
where ID_Arm = 7
set @p ='#$$$' + @p+'Go!'
print @p

Результат '#$$$ТОТ' (куда-то делось 'GO!')

А если преобразование будет к varchar(3), то результат правильный, т.е.

declare @p varchar(100)
select @p = cast(vchAddition as varchar(3)) from A
where ID = 7
set @p ='#$$$' + @p+'Go!'
print @p

Результат '#$$$ТОТGO!'
...
Рейтинг: 0 / 0
Данные типа BINARY
    #32057530
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в trailing nulls.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
USE tempdb
GO

CREATE TABLE A (Col1 binary( 5 ))
GO
INSERT A VALUES(CONVERT(binary( 5 ),'TOT'))
GO
 -- Тут видно, что 4 и 5 байты - нули
 
SELECT * FROM A
GO

declare @p varchar( 100 ) 
select @p = cast(Col1 as varchar( 5 )) from A
set @p ='#$ + @p + 'Go!' 
SELECT @p AS 'varchar(5) cast'
GO


declare @p varchar( 100 ) 
 -- Берем 3 байта
 
select @p = cast(Col1 as varchar( 3 )) from A
set @p ='#$ + @p + 'Go!' 
SELECT @p  AS 'varchar(3) cast'
GO

 + @p + 'Go!' 
SELECT @p  AS 'varchar(3) cast'
GO

 + @p + 'Go!' 
SELECT @p AS 'varchar(5) cast'
GO


declare @p varchar( 100 ) 
 -- Берем 3 байта
 
select @p = cast(Col1 as varchar( 3 )) from A
set @p ='#$ + @p + 'Go!' 
SELECT @p  AS 'varchar(3) cast'
GO

 + @p + 'Go!' 
SELECT @p  AS 'varchar(3) cast'
GO

...
Рейтинг: 0 / 0
Данные типа BINARY
    #32057533
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу игнорировать предыдущий кусок кода - это баг ПО форума...
...
Рейтинг: 0 / 0
Данные типа BINARY
    #32057561
kimkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как же мне слепить строчку, если в поле может быть слово из неизвестного числа символов?
...
Рейтинг: 0 / 0
Данные типа BINARY
    #32057571
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2kimkov

Вы тут написали:
declare @p varchar(100)
select @p = cast(vchAddition as varchar(5)) from А
where ID_Arm = 7
set @p ='#$$$' + @p+'Go!'
print @p

Результат '#$$$ТОТ' (куда-то делось 'GO!')

На самом деле результат будет '#$$$ТОТооGo!', где оо - это два байта 0.
Это просто ваше клиентское приложение (наверное QA) не показывает всю строку. Так что всё правильно работает.
...
Рейтинг: 0 / 0
Данные типа BINARY
    #32057579
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2kimkov:

Если не секрет - зачем хранить строки как binary?
...
Рейтинг: 0 / 0
Данные типа BINARY
    #32057609
kimkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2jimmers

это просто эксперименты разного рода.
А вообще то пытаюсь понять, как можно скрывать информацию. К примеру ,нужно хранить какое-то ключевое слово(типа пароля), которое не каждому дано видеть.
Если знаете, подскажите! Заранее спасибо!
...
Рейтинг: 0 / 0
Данные типа BINARY
    #32057793
olegusan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> К примеру ,нужно хранить какое-то ключевое слово(типа пароля),

Эта задача решаеться просто:

select pwdencrypt('123')
select pwdcompare('123',pwdencrypt('123'))

Note: Функции недокументированные.
...
Рейтинг: 0 / 0
Данные типа BINARY
    #32057985
kimkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
Очень помогли!
...
Рейтинг: 0 / 0
Данные типа BINARY
    #32058013
kimkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 alexeyvg

и все же это не приложение виновато.
например следующий кусок не срабатывает

update A
set vchAddition = cast((cast(vchAddition as varchar(5)) + 'hhh') as binary)
from A where ID_A = 100

в vchAddition по-прежнему остается 'ТОТ'

Что-то не воспринимаются последние нули.Если использовать varchar(3), то все работает, но в моем случае это не годится.

ПРОСВЯТИТЕ!! :-)
...
Рейтинг: 0 / 0
Данные типа BINARY
    #32058045
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и используй varbinary.....
...
Рейтинг: 0 / 0
Данные типа BINARY
    #32058063
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2kimkov
ПРОСВЯЩАЮ. Из чего следует, что в vchAddition по-прежнему остается 'ТОТ'???

Посмотреть можно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
update A 
set vchAddition = cast((cast(vchAddition as varchar( 5 )) + 'hhh') as binary)
from A where ID_A =  100 

select len(vchAddition) as vchAddition_Len,
         SUBSTRING(vchAddition,  1 ,  1 ) as CH_1,
         SUBSTRING(vchAddition,  2 ,  1 ) as CH_2,
         SUBSTRING(vchAddition,  3 ,  1 ) as CH_3,
         SUBSTRING(vchAddition,  4 ,  1 ) as CH_4,
         SUBSTRING(vchAddition,  5 ,  1 ) as CH_5,
         SUBSTRING(vchAddition,  6 ,  1 ) as CH_6,
         SUBSTRING(vchAddition,  7 ,  1 ) as CH_7,
         SUBSTRING(vchAddition,  8 ,  1 ) as CH_8
from A where ID_A =  100 


Причина ошибки-то очевидна!
У Вас есть поле типа binary(5). Байтовая строка в этом поле ВСЕГДА имеет длинну 5 байтов. 3 или даже 4 байта туда записать НЕЛЬЗЯ. Соответственно, значение 'ТОТ' в нём записано быть НЕ МОЖЕТ. Только 'ТОТоо', где оо - 2 байта со значениями 0 или пробел.
И, соответственно, 'ТОТоо' + 'hhh' --> 'ТОТооhhh', далее при обновлении vchAddition обрезается до 'ТОТоо' (т.к. длинна - 5 байтов). При этом, кстати, должна появляться ошибка 8152 (но это зависит от установок коннекта)

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


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