Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вопросы по bytea / 12 сообщений из 12, страница 1 из 1
12.04.2005, 17:34
    #33011462
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по bytea
1. Кто придумал ескейпить служебные символы (0-31) и (127-255) восьмиричной системой счисления? :) Вопрос риторический, но очень интересный.
2. Есть ли альтернативы по укладыванию в БД бинарных данных?

Вопросы возникли в связи с тем, что де-факто файл при конвертации разрастается в 5 раз. Т.е. \\xxx вместо X.

Сейчас конвертацию делаю следующим asm кодом:
Код: 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.
49.
50.
51.
52.
53.
54.
//все сохраняем
              push eax
              push ecx
              push edx
              push ebx
              push esi

//инициализируем цикл
// в sz лежит изначальный размер строки
              mov ecx,sz
              xor edx,edx

// адрес конечной строки 
              mov ebx,mem

// адрес строки для конвертации
              mov esi,sValue

              l1:
                mov [edx+ebx],'\'
                mov [edx+ebx+ 1 ],'\'
                add edx, 2 

// в sz лежит изначальный размер строки
                mov eax,sz
                sub eax,ecx

                mov ah, [eax+esi]

//конвертируем 
                mov al, ah
                shr al, 6 
                add al,0x30
                mov [edx+ebx],al

                mov al,ah
                shr al, 3 
                and al, 7 
                add al,0x30
                mov [edx+ebx+ 1 ],al

                mov al,ah
                and al, 7 
                add al,0x30
                mov [edx+ebx+ 2 ],al
                add edx, 3 
              loop l1

// восстанавливаем регистры
              pop esi
              pop ebx
              pop edx
              pop ecx
              pop eax
...
Рейтинг: 0 / 0
12.04.2005, 19:38
    #33011890
KRED
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по bytea
Prikol ... a chto za problema ?
Ja vot Javoi zipovanie dannie v Postgres kidayou i dostayou i ni kakich "ESC" .... tom bolee ASM
...
Рейтинг: 0 / 0
13.04.2005, 10:33
    #33012504
Hordi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по bytea
Насчет размера файла есть сомнения.Почему ты решил что данные храняться не в бинарном виде?На винте в файле ИМХО никаких \\ххх не будет. Вообще-то протестить можно и посмотреть на размер файла. Как вариант можно хранить строки (тип TEXT), а бинарные данные конвертить в hex-строку(т.е. размер увеличится в 2 раза), но по мне это геморно.
...
Рейтинг: 0 / 0
13.04.2005, 11:13
    #33012683
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по bytea
HordiНасчет размера файла есть сомнения.Почему ты решил что данные храняться не в бинарном виде?На винте в файле ИМХО никаких \\ххх не будет. Вообще-то протестить можно и посмотреть на размер файла. Как вариант можно хранить строки (тип TEXT), а бинарные данные конвертить в hex-строку(т.е. размер увеличится в 2 раза), но по мне это геморно.

То, как он хранится в СУБД - описано в документации. Он действительно хранится(как и все остальные данные) в бинарном виде, и поскольку он явно переменной длины, то скорее всего он будет еще и сжиматься, тносительно своего изначального размера. Вопрос не в этом.
Если я хочу положит в СУБД файл длинной 1Мб, то для выполнения SQL запроса
Код: plaintext
INSERT INTO my_table (file,size) VALUES(str_a, 15 )
Мне нужно сконверитровать файл в строку в \\xxx\\xxx...\\xxx формате, и указать именно ее в качестве str_a. Эта строка занимает в 5 раз больше места в оперативной памяти. Символы от 31 до 127 можно не ескейпить, но это не даст значительного уменьшения объема. Таким образом, мы передаем по сети, из клиентского приложения в 5 раз больше данных, что не может не сказаться на быстродействии. Для сравнения в MS SQL(mySQL) файл в аналогичном запросе увеличивается всего в 2 раза.
Итак вопрос - есть ли другие способы укладывания бинарных данных в СУБД.
Для доступа использую ADO+ODBC из С++builder.
...
Рейтинг: 0 / 0
13.04.2005, 11:21
    #33012721
Sad Spirit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по bytea
Andrey Daeron1. Кто придумал ескейпить служебные символы (0-31) и (127-255) восьмиричной системой счисления? :) Вопрос риторический, но очень интересный.
2. Есть ли альтернативы по укладыванию в БД бинарных данных?

Вопросы возникли в связи с тем, что де-факто файл при конвертации разрастается в 5 раз. Т.е. \\xxx вместо X.

Ваще-то в документации сказано :
[quote документация]
The requirement to escape "non-printable" octets actually varies depending on locale settings. In some instances you can get away with leaving them unescaped.
[/quote]
Личный опыт показывает, что escape'ить необязательно. Могут, наверное, быть проблемы в случае многобайтовых кодировок...
...
Рейтинг: 0 / 0
13.04.2005, 11:29
    #33012749
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по bytea
Ваще-то в документации сказано :
e документация
The requirement to escape "non-printable" octets actually varies depending on locale settings. In some instances you can get away with leaving them unescaped.
[/quote]
Личный опыт показывает, что escape'ить необязательно. Могут, наверное, быть проблемы в случае многобайтовых кодировок...

И вот рядышком, в той-же документации:
e документация
When entering bytea values, octets of certain values must be escaped (but all octet values may be escaped) when used as part of a string literal in an SQL statement. In general, to escape an octet, it is converted into the three-digit octal number equivalent of its decimal octet value, and preceded by two backslashes. Table 8-7 shows the characters that must be escaped , and gives the alternate escape sequences where applicable.

Вот по этому собственно вопрос и возник... Может я чего-то неправильно понимаю?

Вопрос к личному опыту :) - на каких кодировках это работало? Нужно ли эскейпить 0 символ? Ковычки?
Данные помещаю в СУБД оператором INSERT INTO.
...
Рейтинг: 0 / 0
13.04.2005, 11:38
    #33012783
Hordi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по bytea
Ескейпить 0 и кавычки нужно однозначно! На вход-то идет const char*.
...
Рейтинг: 0 / 0
13.04.2005, 12:16
    #33012956
Hordi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по bytea
Если у тебя метровые файлы в базу кидаются, то не проще ли использовать lo_export,lo_import и подобное? Придется через временные файлы работать,но по скорости однозначно намного быстрее чем огромные запросы выполнять!
...
Рейтинг: 0 / 0
13.04.2005, 12:41
    #33013053
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по bytea
HordiЕсли у тебя метровые файлы в базу кидаются, то не проще ли использовать lo_export,lo_import и подобное? Придется через временные файлы работать,но по скорости однозначно намного быстрее чем огромные запросы выполнять!

Эти функции несколько неудобны для удаленной работы с БД. ИМХО. Кроме того, они нарушают логику работы через ADO+ODBC. Если я не прав - с удовольствием выслушаю Вашу точку зрения?
...
Рейтинг: 0 / 0
13.04.2005, 12:47
    #33013077
Hordi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по bytea
Почему неудобны? Почему нарушают? Тебе просто нужно вытягивать(вставлять) данные по идентификатору или уникальному имени, и все.Тебе нужно совать файл только для INSERT и SELECT. Реально-то данные хранятся на сервере,а не у клиента.

Это чтобы долго не рыться:


28.4. Server-Side Functions

There are server-side functions callable from SQL that correspond to each of the client-side functions described above; indeed, for the most part the client-side functions are simply interfaces to the equivalent server-side functions. The ones that are actually useful to call via SQL commands are lo_creat, lo_unlink, lo_import, and lo_export. Here are examples of their use:

CREATE TABLE image (
name text,
raster oid
);

SELECT lo_creat(-1); -- returns OID of new, empty large object

SELECT lo_unlink(173454); -- deletes large object with OID 173454

INSERT INTO image (name, raster)
VALUES ('beautiful image', lo_import('/etc/motd'));

SELECT lo_export(image.raster, '/tmp/motd') FROM image
WHERE name = 'beautiful image';

The server-side lo_import and lo_export functions behave considerably differently from their client-side analogs. These two functions read and write files in the server's file system, using the permissions of the database's owning user. Therefore, their use is restricted to superusers. In contrast, the client-side import and export functions read and write files in the client's file system, using the permissions of the client program. The client-side functions can be used by any PostgreSQL user.
...
Рейтинг: 0 / 0
13.04.2005, 13:51
    #33013313
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по bytea
Значит ли это, что я должен транспортировать файл на сервер самостоятельно? И уже на нем вызывать
INSERT INTO image (name, raster) VALUES ('beautiful image', lo_import('/etc/motd'));
?
...
Рейтинг: 0 / 0
13.04.2005, 14:21
    #33013425
Hordi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по bytea
Конечно нет! Это локальный файл на клиенте.Запросом (INSERT) он перемещается в базу.А через SELECT его можно обратно загрузить в локальный файл.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вопросы по bytea / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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