मैं एक MySQL डेटाबेस के साथ काम कर रहा हूं जिसमें एक्सेल से कुछ डेटा आयात किया गया है । डेटा में गैर- ASCII वर्ण (इम डैश, आदि) के साथ-साथ छिपे हुए कैरिज रिटर्न या लाइन फीड शामिल हैं। क्या MySQL का उपयोग करके इन रिकॉर्ड्स को खोजने का कोई तरीका है?
मैं एक MySQL डेटाबेस के साथ काम कर रहा हूं जिसमें एक्सेल से कुछ डेटा आयात किया गया है । डेटा में गैर- ASCII वर्ण (इम डैश, आदि) के साथ-साथ छिपे हुए कैरिज रिटर्न या लाइन फीड शामिल हैं। क्या MySQL का उपयोग करके इन रिकॉर्ड्स को खोजने का कोई तरीका है?
जवाबों:
यह वास्तव में निर्भर करता है कि आप "ASCII" के रूप में क्या परिभाषित कर रहे हैं, लेकिन मैं सुझाव दूंगा कि आप इस तरह से एक क्वेरी के प्रकार की कोशिश कर सकते हैं:
SELECT * FROM tableName WHERE columnToCheck NOT REGEXP '[A-Za-z0-9]';
वह क्वेरी उन सभी पंक्तियों को लौटा देगी जहाँ कॉलमटॉच में कोई भी गैर-अल्फ़ान्यूमेरिक वर्ण नहीं है। यदि आपके पास अन्य वर्ण हैं जो स्वीकार्य हैं, तो उन्हें नियमित अभिव्यक्ति में वर्ण वर्ग में जोड़ें। उदाहरण के लिए, यदि अवधि, अल्पविराम और हाइफ़न ठीक हैं, तो क्वेरी को इसमें बदलें:
SELECT * FROM tableName WHERE columnToCheck NOT REGEXP '[A-Za-z0-9.,-]';
MySQL प्रलेखन का सबसे प्रासंगिक पृष्ठ शायद 12.5.2 नियमित अभिव्यक्ति है ।
SELECT * FROM tbl WHERE colname NOT REGEXP '^[A-Za-z0-9\.,@&\(\) \-]*$';
MySQL व्यापक चरित्र सेट प्रबंधन प्रदान करता है जो इस तरह की समस्या से निपटने में मदद कर सकता है।
SELECT whatever
FROM tableName
WHERE columnToCheck <> CONVERT(columnToCheck USING ASCII)
CONVERT(col USING charset)
समारोह प्रतिस्थापन अक्षरों में unconvertable वर्ण बदल जाता है। फिर, रूपांतरित और बिना पढ़ा हुआ पाठ असमान होगा।
इसे और चर्चा के लिए देखें। https://dev.mysql.com/doc/refman/8.0/en/charset-repertoire.html
आप ASCII के स्थान पर अपनी इच्छानुसार किसी भी वर्ण सेट नाम का उपयोग कर सकते हैं। उदाहरण के लिए, यदि आप यह जानना चाहते हैं कि कोड पेज 1257 (लिथुआनियाई, लातवियाई, एस्टोनियाई) के उपयोग में कौन से अक्षर सही ढंग से प्रस्तुत नहीं होंगेCONVERT(columnToCheck USING cp1257)
आप ASCII को 0 - 127 (0x00 - 0x7F) के दशमलव मान वाले सभी वर्णों के रूप में परिभाषित कर सकते हैं और निम्न क्वेरी का उपयोग करके गैर- ASCII वर्णों के साथ कॉलम पा सकते हैं
SELECT * FROM TABLE WHERE NOT HEX(COLUMN) REGEXP '^([0-7][0-9A-F])*$';
यह सबसे व्यापक क्वेरी थी जिसके साथ मैं आ सकता था।
SELECT * FROM table WHERE LENGTH( column ) != CHAR_LENGTH( column )
'ā'
(बाइट अनुक्रम द्वारा एन्कोडेड 0x0101
) - यह इस परीक्षण का उपयोग करके "ASCII" समझा जाएगा: एक झूठी नकारात्मक ; वास्तव में, कुछ वर्ण सेट के भीतर एनकोड ASCII वर्ण नहीं है 0x00
करने के लिए 0x7f
जिस इस समाधान एक झूठी सकारात्मक प्राप्त करेगी। यह उत्तर नहीं देते हैं!
LENGTH(column)
की CHAR_LENGTH(column)
परवाह किए बिना एक निरंतर एकाधिक होगा ।
यह शायद वही है जो आप ढूंढ रहे हैं:
select * from TABLE where COLUMN regexp '[^ -~]';
इसे उन सभी पंक्तियों को वापस करना चाहिए जहां COLUMN में गैर-ASCII वर्ण (या गैर-मुद्रण योग्य ASCII वर्ण जैसे नई पंक्ति) हैं।
REGEXP
RLIKE
सही उत्तर के आधार पर, लेकिन ASCII नियंत्रण वर्णों को ध्यान में रखते हुए, मेरे लिए काम करने वाला समाधान यह है:
SELECT * FROM `table` WHERE NOT `field` REGEXP "[\\x00-\\xFF]|^$";
यह एक ही बात करता है: एक कॉलम में एएससीआईआई रेंज के उल्लंघन की खोज करता है, लेकिन आपको नियंत्रण वर्णों के लिए भी खोज करने देता है, क्योंकि यह कोड बिंदुओं के लिए हेक्साडेसिमल नोटेशन का उपयोग करता है। चूंकि कोई तुलना या रूपांतरण नहीं है (@ ओली के जवाब के विपरीत), यह काफी तेज होना चाहिए, भी। (खासकर अगर MySQL regex क्वेरी पर जल्दी-समाप्ति करता है, जो इसे निश्चित रूप से करना चाहिए।)
यह उन क्षेत्रों को लौटाने से भी बचता है जो शून्य-लंबाई वाले हैं। यदि आप थोड़ा लंबा संस्करण चाहते हैं जो बेहतर प्रदर्शन कर सकता है, तो आप इसके बजाय इसका उपयोग कर सकते हैं:
SELECT * FROM `table` WHERE `field` <> "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
यह रेगेक्स पास के लिए विचार किए बिना, शून्य-लंबाई परिणामों से बचने के लिए लंबाई के लिए एक अलग जांच करता है। आपके पास शून्य-लंबाई वाली प्रविष्टियों की संख्या के आधार पर, यह काफी तेज हो सकता है।
ध्यान दें कि यदि आपका डिफ़ॉल्ट वर्ण सेट कुछ विचित्र है, जहां 0x00-0xFF ASCII के समान मानों के लिए मैप नहीं है (क्या ऐसा कोई चरित्र कहीं भी अस्तित्व में है?), यह एक गलत सकारात्मक लौटाएगा। अन्यथा, आनंद लें!
REGEXP
जाँच कर रहा है। इसलिए यह हमेशा मैच की गारंटी है। इसके अलावा ^$
शायद वह नहीं है जो आप चाहते थे।
Oracle में हम नीचे उपयोग कर सकते हैं।
SELECT * FROM TABLE_A WHERE ASCIISTR(COLUMN_A) <> COLUMN_A;