powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Преобразование binary to varchar
10 сообщений из 10, страница 1 из 1
Преобразование binary to varchar
    #35642994
_Kostik_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно сабж. (Sybase ASA 9)
Есть поле типа binary в нем хранится, например, 0x0323f3 необходимо получить '0x0323f3'.
Прямое преобразование естественно не работает, т.к. Sybase пытается преобразовать этот тип как набор кодов символов и выдает свои потуги в преобразовании 0x0323f3 в кодировку cp1251.
Если кто сталкивался с подобной проблемой, подскажите где почитать или как решить данную задачу.
...
Рейтинг: 0 / 0
Преобразование binary to varchar
    #35644760
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
select inttohex( 1234556 );
BOL читать полезно.
...
Рейтинг: 0 / 0
Преобразование binary to varchar
    #35645487
_Kostik_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
select inttohex(1234556);

Эту функцию я смотрел, она мне не подходит в силу того, что мои данные не преобразются к типу int -
0xdf5738d1227e1088c4ed4545a589916007ca6af3e9a2c22dab0d124a8cedbd20ed896f21

Или, возможно, я что-то не так делаю ?

Собственно уши растут из необходимости при слиянии нескольких баз организовать общий список пользователей. На форуме достаточно много обсуждалось различных способов решения (базы находятся в других городах, нужен максимально простой способ), однако я решил пойти по пути выгрузки полей user_name & password из таблицы sysuserperm в файл с помощью функции unload, а затем, загрузив эти данные в промежуточную табличку с помощью Load, вызвать свою процедурку, которая выполнит GRANT CONNECT TO .... . Но для этого необходимо пропарсить исходный password в вид - \xDF\x57\x38\xD1 и т.д.
...
Рейтинг: 0 / 0
Преобразование binary to varchar
    #35647427
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Kostik_однако я решил пойти по пути выгрузки полей user_name & password из таблицы sysuserperm в файл с помощью функции unload, а затем, загрузив эти данные в промежуточную табличку с помощью Load, вызвать свою процедурку, которая выполнит GRANT CONNECT TO .... . Но для этого необходимо пропарсить исходный password в вид - \xDF\x57\x38\xD1 и т.д.
Ну так после выгрузки в текстовый файл, у тебя в файле будет строка '0x1235890abcd.....'. Пусть теперь та промежуточная табличка куда ты заливаешь эти данные принимает это поле как char(76) который потом просто строковыми функциями будешь превращать 0x1234 в "\x12\x34"
Ты уже при выгрузке получишь нормальную шестнадцатиричную строку. Дальше уже всего-лишь вопрос форматирования.
Кстати, мне сейчас лениво проверять, но мне почему-то кажется, что там даже такой минимальной конвертации не нужно будет. Просто формируешь команду типа:
Код: plaintext
GRANT CONNECT TO "user1" IDENTIFIED BY ENCRYPTED 0x12345678abcd....;
Мне кажется что оно должно и так заработать.
...
Рейтинг: 0 / 0
Преобразование binary to varchar
    #35648117
_Kostik_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Ну так после выгрузки в текстовый файл, у тебя в файле будет строка '0x1235890abcd.....'.

Увы будет - 0x1235890abcd..... без кавычек при запросе:
Код: plaintext
unload select password from sys.SYSUSERPERM to 'c:\1.txt';
При попытке сделать например:
Код: plaintext
unload select cast(password as varchar) from sys.SYSUSERPERM to 'c:\1.txt';
Sybase попытается преобразовать 0x1235890abcd в символы согласно кодовой таблицы, т.е. выдаст аброкадабру.
White Owl
Кстати, мне сейчас лениво проверять, но мне почему-то кажется, что там даже такой минимальной конвертации не нужно будет. Просто формируешь команду типа:
Код: plaintext
GRANT CONNECT TO "user1" IDENTIFIED BY ENCRYPTED 0x12345678abcd....;
Мне кажется что оно должно и так заработать.

Из ISQL такую команду задать конечно можно, кстати, проверил, если напрямую задать 0x12345678abcd.... без форматирования - работать не будет (запрос выполнится, но под паролем уже не зайдешь). Но из процедуры эту строку сформировать не получается, т.к. снова вылазит аброкадабра преобразования, что так:
Код: plaintext
execute immediate 'GRANT CONNECT TO "'  || inUserName || '" IDENTIFIED BY ENCRYPTED ''' || password || ''';';
что так:
Код: plaintext
execute immediate 'GRANT CONNECT TO "'  || inUserName || '" IDENTIFIED BY ENCRYPTED ' || password || ';';
На текущий момент просто написали внешний скрипт на sh, который выставляет кавычки. Поиски решения непосредственно на sql успехом пока не увенчались.
...
Рейтинг: 0 / 0
Преобразование binary to varchar
    #35650172
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Kostik_На текущий момент просто написали внешний скрипт на sh, который выставляет кавычки. Поиски решения непосредственно на sql успехом пока не увенчались.Внешний скрипт это вполне легальное решение задачи.

В принципе, любой внешний файл можно загружать через xp_read_file и самостоятельно его разбирать. А не через load который действительно попытается сконвертировать поле опознаное как binary в текст при загрузке в varchar поле.

Еще можно сделать то самое cast(password as varchar) и полученную строку символов прогнать через цикл типа такого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
begin
declare i integer; declare s varchar( 150 );
declare pas varchar( 76 );
set pas = (select password from sys.sysuser where user_name='user1');
set i= 1 ; set s='';
while i<=length(pas) loop
    set s = s || '\x' || right( inttohex( ascii( substring( pas, i,  1 ) ) ),  2 );
    set i = i+ 1 ;
end loop;
select s;
end;
...
Рейтинг: 0 / 0
Преобразование binary to varchar
    #35650568
_Kostik_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю, действительно цикл вполне работоспособен !
...
Рейтинг: 0 / 0
Преобразование binary to varchar
    #35656118
Stalker4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Код: plaintext
1.
while i<=length(pas) loop

Небольшой вопрос по этой строке: Умеет ли SA (10, 11) оптимизировать подобные вызовы ?
Что будет в данном конкретном случае: SA будет на каждом этапе цикла считать длину строку дергая функцию length или он может вместо length(pas) подставить значение (константу) и использовать для цикла ее ?
...
Рейтинг: 0 / 0
Преобразование binary to varchar
    #35656936
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не слишком умным должен быть оптимизатор? А если я внутри цикла манипулирую длинной строки pas? - вставляю \ удаляю символы, заменяю подстроку на подстроку и т.д.
...
Рейтинг: 0 / 0
Преобразование binary to varchar
    #35656955
_Kostik_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выражение:
Код: plaintext
1.
while i<=length(pas) loop
будет вычисляться на каждой итерации цикла. Желающие могут оптимизировать данный код через переменную:
Код: plaintext
1.
2.
set len = length(pas);
while i<= len loop
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Преобразование binary to varchar
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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