Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.20;
Скачать: CL | DM;

Вниз

поле типа блоб   Найти похожие ветки 

 
Olegus   (2008-02-13 10:36) [0]

Привет всем мастерам. Кто знает можно ли сделать запрос дистинкт с поля типа блоб. Если да то как это сделать? За ранее спасибо.


 
Johnmen ©   (2008-02-13 10:43) [1]

Нет.


 
ANB   (2008-02-13 11:21) [2]

Нельзя использовать его также в операциях сравнения, кроме "из нулл", в индексах, группировках и еще много где.


 
Desdechado ©   (2008-02-13 12:10) [3]

Интересно, откуда могут расти ноги для такой потребности?


 
Anatoly Podgoretsky ©   (2008-02-13 12:21) [4]

> Olegus  (13.02.2008 10:36:00)  [0]

Я не знаю, позволяет ли ФБ кастинг на этот тип, если позволяет то какая проблема.


 
Desdechado ©   (2008-02-13 12:32) [5]

> позволяет ли ФБ кастинг на этот тип
Интересно, во что можно закастить пару сотен мегабайт?

Кстати, идея. Можно применить DISTINCT к функции хэша от блоба, например.


 
Johnmen ©   (2008-02-13 12:36) [6]

А ещё его, хэш, можно как следует, от души проксорить :)))


 
Anatoly Podgoretsky ©   (2008-02-13 12:52) [7]

> Desdechado  (13.02.2008 12:32:05)  [5]

Ну например в MS SQL я могу закастить в varchar(2гб), но что может ФБ я не знаю, я не отслеживаю, что там в новых версиях появилось


 
Anatoly Podgoretsky ©   (2008-02-13 12:54) [8]

Автор истинный партизан, говорит как неправильно хочет сделать, а не что и зачем.


 
PEAKTOP ©   (2008-02-13 12:54) [9]

запрос  дистинкт с поля типа блоб.
Вы вообще понимаете смысл БЛОБ-в ? БЛОБ - это бинарный поток данных, че там внутри лежит - неизвестно (можно картинку, AutoCAD-овский чертеж, текст, музыка, фильм и т.д.) Однозначно про БЛОБ можно сказать, что это набор байт неизвестной длины (пока не достигнут признак конца БЛОБа). Физически БЛОБы хранятся отдельно от таблицы, а в основной таблице в поле типа БЛОБ хранится идентификатор БЛОБа (BLOB_ID - целое число типа Int64) в общей куче БЛОБов.

Теперь Вы предлагаете сравнить эти потоки... Теоретически можно, но практически - сервер памяти сожрет немеряно, в итоге может даже "завесить" ОС. Поэтому эту функцию никто даже описывать не пытался - практическое использование затруднено.

Если да то как это сделать?
На практике это делают через хэши. То есть если в таблице есть поле типа БЛОБ, то создают еще одно поле "ХЕШ", по которому создают индекс и которое считают перед вставкой/изменением БЛОБа. Например, в примитивном случае, когда БЛОБ - текст, можно в поле хеша копировать первые 50 символов текста, в некоторых тривиальных случаях (например, вэб-блог, форум) этого достаточно. В сложных вариантах, где БЛОБ, например, AutoCAD-овский чертеж, пишется UDF, которая считает контрольную сумму или хеш в зависимости от формата данных. Ну, и соответственно, distinct делается по полю ХЕШ. 100% гарантии такой подход не дает, но на практике случаи одинаковых хешей крайне редки.

Нельзя использовать его также в операциях сравнения, кроме "из нулл", в индексах, группировках и еще много где.
Вопреки общепринятому мнению, БЛОБы сравнивать можно, только нужно понимать механизм сравнения БЛОБов.
Вариант первый: сравнение IS NULL. На самом деле сравнивается BLOB_ID из таблицы, он либо NULL, либо идентификатор БЛОБа в общей куче. А сам БЛОБ может быть нулевой длины (пустая строка).
Вариант второй: в триггерах, где стравнивается IF (NEW.BLOB_FIELD<>OLD.BLOB_FIELD) аналогично сравниваются BLOB_ID, что является достаточным признаком того, что БЛОБ меняли (если изменить поле БЛОБ, то запишеться новая версия, а BLOB_ID новой версии будет помещен в основную таблицу).
Варинт третий: для БЛОБов с SUB_TYPE TEXT применимы операции сравнения в запросах SELECT, как для полей с типом [VAR]CHAR (LIKE, CONTAINING, STARTING WITH), а также функции LOWER, UPPER, TRIM(), начиная с версии Firebird v1.5.

Создавать индекс по полю типа БЛОБ однозначно нельзя.

Использовать БЛОБ в группировке полей можно в версии Firebird v1.5-Firebird v2.0, в версии Firebird v2.0.4 - Firebird v2.1RC1 - нельзя, в версии Firebird v2.1 RC2 снова будет можно. Группировка подразумевает собой четкое упорядочивание значений по группируемым полям (что есть скрытое сравнение вместе с DISTINCTом), и Вы должны четко понимать, что в случае с БЛОБом будут сравниваться BLOB_ID, а не содержимое БЛОБа. Костыли эти будут приделаны снова в связи с тем, что разработчики получили кучу жалоб о неработающем старом софте (писавшемся еще для IB6) на новой версии сервера в связи с тем, что авторы софта использовали БЛОБы в группировках.


 
jack128_   (2008-02-13 13:49) [10]


> PEAKTOP ©  


Я правельно понимаю, что если я напишу
update MyTable set MyBlob = :MyBlob  но во все записи таблицы запишится одинаковый блоб ид ??


 
Johnmen ©   (2008-02-13 14:21) [11]


> jack128_   (13.02.08 13:49) [10]

Ага.



Страницы: 1 вся ветка

Текущий архив: 2008.07.20;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
2-1213614223
Рустам1
2008-06-16 15:03
2008.07.20
delete from


6-1189537494
Sharp
2007-09-11 23:04
2008.07.20
помогите с куками


2-1213984177
Res
2008-06-20 21:49
2008.07.20
exit и procedure


15-1212669800
андр.
2008-06-05 16:43
2008.07.20
MS SQL 2000


1-1195638277
sia
2007-11-21 12:44
2008.07.20
применение свойства Anchors