PDA

View Full Version : سوال: مشکل مقایسه عکس در دیتابیس



Payman62
شنبه 24 بهمن 1388, 22:57 عصر
سلام.
من یه دیتابیس دارم که داخل یکی از تیبل هاش یه فیلد از نوع image دارم.
مشکلی در ذخیره و بازیابی عکس در دیتابیس رو ندارم.
ولی هنگام سرچ یه عکس خاص به مشکل بر میخورم. من میخوام هنگام insert کردن عکس جدید سرچ کنم که اگه اون عکس موجود بود از همون عکس قبلی که در دیتابیس هست استفاده کنم و عکس تکراری ثبت نکنم.
یه تابع در sql نوشتم به این صورت:


create FUNCTION Test(@a image)
RETURNS TABLE
AS
RETURN
(
SELECT * FRom Pictures
WHERE Pic = @a
);

اما به WHERE Pic = @a گیر میده و تابع ساخته نمیشه. ظاهرا امکان استفاده از تایپ image در مقایسه وجود نداره.
حالا چه راهی پیشنهاد میکنید؟

محمد سلیم آبادی
یک شنبه 25 بهمن 1388, 03:35 صبح
CREATE FUNCTION Test(@a image)
RETURNS TABLE AS
RETURN SELECT *
FROM Pictures
WHERE DATALENGTH(Pic) = DATALENGTH(@a)

ASKaffash
یک شنبه 25 بهمن 1388, 08:42 صبح
سلام.
من یه دیتابیس دارم که داخل یکی از تیبل هاش یه فیلد از نوع image دارم.
مشکلی در ذخیره و بازیابی عکس در دیتابیس رو ندارم.
ولی هنگام سرچ یه عکس خاص به مشکل بر میخورم. من میخوام هنگام insert کردن عکس جدید سرچ کنم که اگه اون عکس موجود بود از همون عکس قبلی که در دیتابیس هست استفاده کنم و عکس تکراری ثبت نکنم.
یه تابع در sql نوشتم به این صورت:


create FUNCTION Test(@a image)
RETURNS TABLE
AS
RETURN
(
SELECT * FRom Pictures
WHERE Pic = @a
);

اما به WHERE Pic = @a گیر میده و تابع ساخته نمیشه. ظاهرا امکان استفاده از تایپ image در مقایسه وجود نداره.
حالا چه راهی پیشنهاد میکنید؟
سلام
جستجوی یک عکس براساس محتوا یا طول فایل آن کار منطقی نیست (چون چند عکس متفاوت میتوانند طول یکسان داشته باشندو ... ) شما باید از عکس پارامترهای دیگری را ذخیره و با آن عکس را بازیابی کنید مثل شماره آرشیو / تاریخ / نام فایل / یک Hash از فایل / ... بنظرم
علت استفاده را اعلام کنید تا همفکری شود

Payman62
یک شنبه 25 بهمن 1388, 23:32 عصر
سلام.
خلاصش اینه که در تیبل تعدادی عکس ذخیره میشه. اما نمیخوام تکراری ذخیره بشه که db سنگین شه.

ظاهرا راه حل استاندارد برای این مشکل وجود نداره و برای مقایسه عکس باید از روش های دیگه استفاده کرد.
روش طول عکس که منطقی نیست به نظرم. چون امکان خطا داره به هر حال.

میدونید که اطلاعات عکس ها به صورت آرایه ای از بایت سلکت میشن. ابتدای برنامم کل عکس ها سلکت میشن تو یه دیتاست. توسط یه تابع دونه دونه عکس ها رو از حالت بایت به عکس تبدیل کردم و با عکس جدید مقایسه کردم. اما در مواردی که دو عکس یکی بودن هم حاصل مقایسه فالس بود.
البته این روش کمی هم کند هست چون باید اطلاعات هر عکس که آرایه هست تبدیل شه به عکس و در تعداد بالا وقت میگیره.

فکر میکنم روش hash کردن عکس ها روش مناسبی باشه. بسیار سریع تر و راحت تر جواب میده. یعنی یه فیلد برای هش عکس ها قرار بدم.
طول hash با روش md5 حداکثر 32 کاراکتر هست دیگه؟ میخوام طول فیلد رو char(32) بذارم.

روش دیگه ای هم اگه مد نظرتون هست مطرح کنید تا استفاده کنیم.