Форум: "Базы";
Текущий архив: 2008.07.20;
Скачать: [xml.tar.bz2];
Внизполе типа блоб Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.044 c