मेरे पास एक MySQL डेटाबेस है जिसमें बाइनरी-टाइप किए गए कॉलम वाले टेबल हैं। मैं इसे चलाने के बिना उस कॉलम को प्रोजेक्ट करने में सक्षम होना चाहता हूं, उदाहरण के लिए, HEX()
। क्या mysql
सीएलआई उपकरण में एक कॉन्फ़िगरेशन विकल्प या अन्य साधन हैं जो बाइनरी डेटा का प्रतिनिधित्व इस तरीके से प्रदर्शित करने के लिए करते हैं जो मेरे कंसोल के लिए मनमानी बाइट्स को उल्लसित/कष्टप्रद तरीके से समझने के लिए आउटपुट नहीं करेगा?क्या MySQL सीएलआई उपकरण कंसोल-अनुकूल तरीके से बाइनरी डेटा प्रदर्शित करने का एक तरीका प्रदान करता है?
क्या MySQL सीएलआई उपकरण कंसोल-अनुकूल तरीके से बाइनरी डेटा प्रदर्शित करने का एक तरीका प्रदान करता है?
उत्तर
जब से तुम ज्यादातर सुविधा के लिए मेज पर देखने के लिए, दृश्य बनाने हैं:
SELECT * FROM myview;
यह एक समाधान है हालांकि यह सही नहीं है। – smartwjw
व्यवहार: फिर
CREATE OR REPLACE VIEW myview AS
SELECT col1, HEX(col2) AS col2, col3, etc....
FROM table;
, तुम सब करने की ज़रूरत संदर्भ myview
बजाय table
है बाइनरी डेटा के साथ परिणाम सेट देखने पर MySQL कमांड लाइन क्लाइंट का हमेशा मुझे परेशान रहा है, असल में मुझे यह पृष्ठ मिला क्योंकि मुझे एक बार फिर से MySQL कमांड लाइन क्लाइंट द्वारा परेशान किया गया था (मेरे टर्मि में बाइनरी डेटा डंपिंग नल बाइनरी यूयूआईडी कॉलम के साथ सेट किए गए परिणाम को देखते हुए) और मैं इस मुद्दे को एक बार और सभी के लिए हल करना चाहता था :-)
विचार बनाना वास्तव में मेरे लिए एक विकल्प नहीं है (मैं दर्जनों तालिकाओं को देख रहा हूं बाइनरी यूयूआईडी कॉलम) और मैंने यह भी पाया कि SELECT *
से इसके बजाय सभी कॉलम नाम टाइप करने के लिए स्विच करना वास्तव में परेशान है (बस HEX()
को एक कॉलम के मान पर लागू किया जा सकता है)।
आखिरकार मैं एक रचनात्मक हैक के साथ आया जो इस परेशानी के वैकल्पिक समाधान के लिए प्रेरणा प्रदान करता है: टर्मिनल प्रतिपादन के लिए आउटपुट को स्वच्छ करने के लिए कस्टम पेजर कमांड का उपयोग करना। यहाँ यह कैसे काम करता है:
#!/usr/bin/python
import binascii, string, sys
for line in sys.stdin:
line = line.rstrip()
column, _, value = line.partition(': ')
if any(c not in string.printable for c in value):
sys.stdout.write("%s: %s\n" % (column, binascii.hexlify(value)))
else:
sys.stdout.write("%s\n" % line)
प्रारंभ MySQL कमांड लाइन ग्राहक इस प्रकार है::
$ mysql --pager=/home/peter/binary-filter.py --vertical ...
एक निष्पादन योग्य (chmod + x) पायथॉन लिपि निम्नलिखित सामग्री के साथ बनाएं
लागू होने पर पाइथन स्क्रिप्ट का पथनाम बदलें। आप स्क्रिप्ट को अपने
$PATH
में भी डाल सकते हैं, उस स्थिति में आप नाम को--pager
विकल्प (जैसे किless
का उपयोग MySQL क्लाइंट के पेजर के रूप में) के समान ही कर सकते हैं।अब जब आप
SELECT ...
, किसी भी लाइन है कि एक स्तंभ जिसका मान प्रिंट न हो सकने पात्रों ताकि पूरा मूल्य हेक्साडेसिमल वर्ण, MySQL केHEX()
समारोह के परिणामों के समान के रूप में प्रदान की गई है फिर से लिखा है पता चलता है।
अस्वीकरण: यह एक पूर्ण समाधान से दूर अजगर झलकी मैं पता चला SELECT ... \G
प्रारूप उत्पादन (इसलिए --vertical
विकल्प) की उम्मीद है, उदाहरण के लिए और इसलिए यह शामिल करने के लिए बाध्य किया है तो मुझे पांच मिनट के सभी के लिए यह परीक्षण किया कीड़े।
मेरा बिंदु यह दिखाने के लिए था कि समस्या MySQL कमांड लाइन क्लाइंट के पक्ष में हल की जा सकती है, क्योंकि यही समस्या है!(यही कारण है कि मुझे सर्वर साइड व्यू को परिभाषित करने के लिए पीछे की ओर लगता है - केवल कमांड लाइन क्लाइंट को अधिक उपयोगकर्ता के अनुकूल बनाने के लिए :-P)
मेरे लिए डेटाबेस आकार में कोई समस्या नहीं है, इसलिए मैं दो अलग-अलग कॉलम का उपयोग करूंगा प्रत्येक तालिका में, एक बाइनरी (16) के रूप में, और दूसरे को इंडेक्सिंग के बिना चार (32) के रूप में। दोनों के पास एक ही मूल्य होगा। जब मुझे खोज करने की ज़रूरत है तो मैं बाइनरी कॉलम का उपयोग करूंगा, और जब मुझे पढ़ने की ज़रूरत है तो मैं char (32) का उपयोग करूंगा। इस परिदृश्य के साथ कोई समस्या है? मेरे लिए /etc/my.cnf
कार्यों में
सेट mysql ग्राहक विकल्प:
[client]
binary-as-hex = true
[mysql]
binary-as-hex = true
क्या 'हेक्स साथ कुछ गड़बड़ है()'? यह सही समाधान लगता है। – wallyk
क्योंकि ऐसा करने के लिए जब मैं वास्तव में चाहता हूं तो एक त्वरित 'चयन * ...' काफी असुविधाजनक है। –