2013-06-19 6 views
5

मेरे पास एक सारणी है जो एचडीडी पर वास्तविक फाइलों के सापेक्ष पथ रखती है। उदाहरण के लिए:क्या MySQL जांच सकता है कि फ़ाइल मौजूद है?

SELECT * FROM images --> 
id | path 
1 | /files/1.jpg 
2 | /files/2.jpg 

क्या मैं गैर-मौजूद फ़ाइलों को इंगित करने वाले सभी रिकॉर्ड चुनने के लिए कोई क्वेरी बना सकता हूं? मुझे इसे PHP-क्लाइंट में पुनरावृत्ति का उपयोग किए बिना, MySQL सर्वर द्वारा बिल्कुल जांचना होगा।

+0

यह एक बहुत ही खराब डिज़ाइन है। –

+0

मुझे विश्वास नहीं है कि इस प्रकार की चीज़ के लिए MySQL फ़ाइल सिस्टम में किसी भी प्रकार की पहुंच है। इसे प्राप्त करने के लिए आपको बाहरी भाषा का उपयोग करने की आवश्यकता होगी। – ethrbunny

+0

बोगदान बुरीम, क्यों बुरा?छवि डेटा को बिनरी फ़ील्ड में रखना बेहतर है या क्या? – WindBridges

उत्तर

3

MYSQL केवल डेटाबेस को संभालता है इसलिए फ़ाइल मौजूद होने पर एचडीडी पर जांच करने के लिए SQL स्टेटमेंट को आग लगाने का कोई तरीका नहीं है। आपको पंक्तियों पर फिर से चलने और PHP के साथ जांच करने की आवश्यकता है।

+0

प्राप्त करने का प्रयास करने के लिए एक सुझाव हो सकता है। मैंने सोचा कि अगर हो सकता है कि MySQL को लोड डेटा इन्फाइल इत्यादि जैसे अन्य शब्दों में उपयोगकर्ता फ़ाइलों तक पहुंचा जा सके, तो फ़ाइल में मौजूद होने पर यह जांचने के लिए कुछ हो सकता है। – WindBridges

+0

या आप अपनी फाइलें अपने डेटाबेस में बाइनरी लार्ज ऑब्जेक्ट बीएलओबी के रूप में स्टोर कर सकते हैं और जांच सकते हैं कि वे डेटाबेस – RafaSashi

10

मैं इस तरह एक प्रश्न के साथ जाना होगा:

SELECT id, path, ISNULL(LOAD_FILE(path)) as not_exists 
FROM images 
HAVING not_exists = 1 

समारोह LOAD_FILE स्ट्रिंग के रूप फ़ाइल को लोड करने की कोशिश करता है, और NULL रिटर्न जब यह विफल रहता है।

कृपया ध्यान दें कि इस मामले में विफलता इस तथ्य के कारण हो सकती है कि MySQL बस उस विशिष्ट स्थान को नहीं पढ़ सकता है, भले ही फ़ाइल वास्तव में मौजूद हो।

संपादित करें:

रूप @ostrokach टिप्पणी में कहा, इस मानक एसक्यूएल नहीं भले ही MySQL यह अनुमति देता है, मानक का पालन करने के लिए यह हो सकता है:

SELECT * 
FROM images 
WHERE LOAD_FILE(PATH) IS NULL 
+0

में मौजूद हैं या नहीं, मैं इसे अपने लिए काम नहीं कर सकता। वास्तव में मौजूद सभी फाइलें मौजूद हैं। इसका मतलब यह हो सकता है कि यह स्थानीय स्थान MySQL के लिए अपठनीय है? http://stackoverflow.com/questions/27495830/retrieve-a-list-of-missing-files-from-field-using-mysql?noredirect=1#comment43423726_27495830 –

+0

यह हो सकता है कि उपयोगकर्ता MySQL डिमन चल रहा हो फ़ोल्डर (ओं) जिसमें वे फ़ाइल हैं। –

+0

'HAVING not_exists = 1' हिस्सा गलत है, क्योंकि आप not_exists द्वारा समूहबद्ध नहीं हैं। मैं केवल उन्हीं पंक्तियों का चयन करना चाहता हूं जिनके लिए एक फ़ाइल मौजूद है, आपको कुछ ऐसा करना चाहिए: 'आईडी चुनें, छवियों से पथ जहां LOAD_FILE (पथ) नल है; – ostrokach

0

यह संभव नहीं है का उपयोग करते हुए स्टॉक MySQL। हालांकि आप UDF (उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन) लिख सकते हैं, शायद सी में, इसे CREATE FUNCTION कथन का उपयोग करके लोड करें और इसे MySQL से उपयोग करें क्योंकि आप किसी अंतर्निहित फ़ंक्शन का उपयोग करेंगे।

+0

जो मुझे पता है, के लिए mysql कस्टम बनाया गया फ़ंक्शंस केवल SQL का उपयोग करता है। –

+1

@MatteoTassinari कृपया जुड़े संसाधनों को पढ़ें। आप SQL में लिखे गए "संग्रहीत फ़ंक्शंस" बना सकते हैं और आप "उपयोगकर्ता-परिभाषित फ़ंक्शंस" बना सकते हैं जिन्हें साझा लाइब्रेरी में संकलित किया जाता है और रनटाइम पर लोड किया जाता है। –

+0

ऐसा लगता है कि मैं गलत था, क्षमा करें, और इसे इंगित करने के लिए धन्यवाद :) –

3

MySQL LOAD_FILE कमांड को उन फ़ाइलों पर बहुत कड़े आवश्यकताओं की आवश्यकता है जो इसे खोल सकते हैं। MySQL दस्तावेज़ों से:

[LOAD_FILE] फ़ाइल पढ़ता है और फ़ाइल सामग्री को स्ट्रिंग के रूप में लौटाता है। इस फ़ंक्शन का उपयोग करने के लिए, फ़ाइल सर्वर होस्ट पर स्थित होना चाहिए, आपको फ़ाइल में पूरा पथ नाम निर्दिष्ट करना होगा, और आपके पास FILE विशेषाधिकार होना चाहिए। फ़ाइल को max_allowed_packet बाइट्स से कम और उसके आकार के द्वारा पठनीय होना चाहिए। यदि safe_file_priv सिस्टम चर को एक गैर-खाली निर्देशिका नाम पर सेट किया गया है, तो लोड होने वाली फ़ाइल उस निर्देशिका में स्थित होना चाहिए।

तो अगर फ़ाइल mysql उपयोगकर्ता द्वारा नहीं पहुँचा जा सकता या अन्य आवश्यकताओं के किसी भी संतुष्ट नहीं हैं, LOAD_FILENull वापस आ जाएगी। bash का उपयोग कर

 
mysql db_name --batch -s -e "SELECT id, path FROM images" \ 
    | awk '{if(system("[ -e " $2 " ]") == 1) {print $1}}' \ 
    >> missing_ids.txt 

या बस:


आप awk का उपयोग कर आईडी लापता फाइलों के अनुरूप की एक सूची प्राप्त कर सकते हैं

 
mysql db_name --batch -s -e "SELECT id, path FROM images" \ 
    | while read id path ; if [[ -e "$path" ]] ; then echo $id ; done 
    >> missing_ids.txt 

यह भी बहुत तेजी से किया जा रहा है का लाभ दिया है LOAD_FILE से अधिक।

+0

यदि फ़ाइल नाम में एक राउंड ब्रैकेट "()" है तो यह आदेश त्रुटियों को फेंकता है। क्या इसके चारों ओर कोई रास्ता है ताकि यह किसी भी प्रकार के फ़ाइल नाम को संभाल सके? – CarstenSchmitz

+0

@CarstenSchmitz मैंने लूप के दौरान बैश का उपयोग करने का एक उदाहरण जोड़ा। आप इसके बजाय इसका उपयोग करने का प्रयास कर सकते हैं। – ostrokach

संबंधित मुद्दे