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

В Таблице А есть поле типа 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
11.10.2002, 14:39:31
    #32057530
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные типа BINARY
Дело в 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
11.10.2002, 14:45:04
    #32057533
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные типа BINARY
Прошу игнорировать предыдущий кусок кода - это баг ПО форума...
...
Рейтинг: 0 / 0
11.10.2002, 15:55:29
    #32057561
kimkov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные типа BINARY
Как же мне слепить строчку, если в поле может быть слово из неизвестного числа символов?
...
Рейтинг: 0 / 0
11.10.2002, 16:30:01
    #32057571
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные типа BINARY
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
11.10.2002, 16:48:03
    #32057579
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные типа BINARY
2kimkov:

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

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

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

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

Note: Функции недокументированные.
...
Рейтинг: 0 / 0
14.10.2002, 14:29:50
    #32057985
kimkov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные типа BINARY
Спасибо.
Очень помогли!
...
Рейтинг: 0 / 0
14.10.2002, 14:59:53
    #32058013
kimkov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные типа BINARY
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
14.10.2002, 16:02:02
    #32058045
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные типа BINARY
ну и используй varbinary.....
...
Рейтинг: 0 / 0
14.10.2002, 16:45:14
    #32058063
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Данные типа BINARY
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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Данные типа BINARY / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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