Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.058 c
2-1214068798
Ia
2008-06-21 21:19
2008.07.20
Вопрос


2-1213685432
Муслик
2008-06-17 10:50
2008.07.20
Проследняя запись в таблице


2-1213778616
девушка
2008-06-18 12:43
2008.07.20
cxGrid - разделитель разрядов в sumary


15-1212324034
md10
2008-06-01 16:40
2008.07.20
Windows XP


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский