मैं MySQL में गैर-ASCII वर्ण कैसे पा सकता हूं?


124

मैं एक MySQL डेटाबेस के साथ काम कर रहा हूं जिसमें एक्सेल से कुछ डेटा आयात किया गया है । डेटा में गैर- ASCII वर्ण (इम डैश, आदि) के साथ-साथ छिपे हुए कैरिज रिटर्न या लाइन फीड शामिल हैं। क्या MySQL का उपयोग करके इन रिकॉर्ड्स को खोजने का कोई तरीका है?


8
ओली जोन्स का बेहतर जवाब (नीचे की जाँच करें) है।
जोनाथन अर्केल

1
@JonathanArkell अब तल पर नहीं है :)
ब्रिलियनड

सुधार .. बीच की जाँच करें! ;)
जोनाथन अर्केल

यह है जवाब @Jonathan के बारे में बात कर रही है stackoverflow.com/a/11741314/792066
Braiam

जवाबों:


64

यह वास्तव में निर्भर करता है कि आप "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 नियमित अभिव्यक्ति है


3
क्या आपको हाइफ़न और अवधि से बच नहीं जाना चाहिए? (चूंकि वे एक नियमित अभिव्यक्ति में विशेष अर्थ रखते हैं।) तालिका से नाम चुनें * जहां कॉलम नहीं है वहां रजिस्टर करें '[A-Za-z0-9 \।, \ -]';
१६:०२ पर मोरनी

3
@Tooony नहीं, एक सेट के अंदर, एक अवधि का अर्थ है स्वयं और डैश का केवल अन्य वर्णों के बीच विशेष अर्थ है। सेट के अंत में, इसका मतलब ही है।
माइकल स्पेस

10
यह क्वेरी केवल तालिका नाम की सभी पंक्तियों को खोजती है जिसमें अल्फ़ान्यूमेरिक वर्ण नहीं होता है। इस सवाल का जवाब नहीं है।
रोब बैली

8
यह उन स्तंभों के लिए है, जिनमें किसी भी प्रकार के एएससीआई अक्षर नहीं हैं, इसलिए यह एससीआई और गैर-एएससीआई अक्षरों के मिश्रण से छूट जाएगा। एक या एक से अधिक गैर-असि अक्षर के लिए ज़ेंडे चेक से नीचे का उत्तर। इसने मुझे सबसे अधिक भाग के लिए मदद कीSELECT * FROM tbl WHERE colname NOT REGEXP '^[A-Za-z0-9\.,@&\(\) \-]*$';
फ्रैंक फोर्ट

1
यह केवल (वैसे भी मेरे लिए) उन पात्रों को खोजने के लिए काम करता है जिनमें उन पात्रों का कोई नहीं है। इसमें ऐसे तार नहीं पाए जाते हैं जिनमें ASCII और गैर-ASCII वर्णों का मिश्रण होता है।
इयान

236

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)


20
यह इस समस्या का एक उत्कृष्ट समाधान है और बहुत अधिक मजबूत है।
क्रेगडोग्लास

5
यह उच्चारणों के साथ वर्णों को खोजने के लिए भी उपयोगी है (ä ä आदि) या एन्कोडिंग से संबंधित चरित्र नहीं
Glasnhost

3
REGEXP (जो लहजे खोजने के लिए मेरे लिए काम नहीं करता है) का उपयोग करने से बहुत बेहतर है और फिर से सबकुछ बनाने के लिए एक सरल तंत्र भी प्रदान करता है ...
डिर्क कॉनराड कोएट्सी

1
यह उत्तर आश्चर्यजनक रूप से काम करता है और ऐसे तार लाएगा जिनमें केवल गैर-एएससीआईआई अक्षर होते हैं, जिसमें केवल गैर-एएससीआईआई अक्षर होते हैं। धन्यवाद!
इयान

2
बकाया समाधान!
मैड डॉग टैनैन

93

आप ASCII को 0 - 127 (0x00 - 0x7F) के दशमलव मान वाले सभी वर्णों के रूप में परिभाषित कर सकते हैं और निम्न क्वेरी का उपयोग करके गैर- ASCII वर्णों के साथ कॉलम पा सकते हैं

SELECT * FROM TABLE WHERE NOT HEX(COLUMN) REGEXP '^([0-7][0-9A-F])*$';

यह सबसे व्यापक क्वेरी थी जिसके साथ मैं आ सकता था।


3
अब तक का सबसे अच्छा जवाब, लेकिन यह इस तरह भी आसान है:SELECT * FROM table WHERE LENGTH( column ) != CHAR_LENGTH( column )
SuN

15
-1 यह गलत परिणाम दे सकता है। उदाहरण के लिए, मान लीजिए कि किसी के पास UTF-16 कॉलम है 'ā'(बाइट अनुक्रम द्वारा एन्कोडेड 0x0101) - यह इस परीक्षण का उपयोग करके "ASCII" समझा जाएगा: एक झूठी नकारात्मक ; वास्तव में, कुछ वर्ण सेट के भीतर एनकोड ASCII वर्ण नहीं है 0x00करने के लिए 0x7fजिस इस समाधान एक झूठी सकारात्मक प्राप्त करेगी। यह उत्तर नहीं देते हैं!
अर्ग्याल

2
@sun: यह बिल्कुल भी मदद नहीं करता है - कई चरित्र सेट निश्चित-लंबाई के होते हैं और इसलिए मूल्य LENGTH(column)की CHAR_LENGTH(column)परवाह किए बिना एक निरंतर एकाधिक होगा ।
अर्ग्याल

49

यह शायद वही है जो आप ढूंढ रहे हैं:

select * from TABLE where COLUMN regexp '[^ -~]';

इसे उन सभी पंक्तियों को वापस करना चाहिए जहां COLUMN में गैर-ASCII वर्ण (या गैर-मुद्रण योग्य ASCII वर्ण जैसे नई पंक्ति) हैं।


7
मेरे लिए बहुत अच्छा काम करता है। "regexp '[^ - ~]'" का अर्थ है कि एक वर्ण है जो अंतरिक्ष से पहले है "या" ~ "या ASCII 32 के बाद - 126. सभी अक्षर, संख्या और प्रतीक, लेकिन कोई अनपेक्षित चीजें नहीं।
जोश

आप इसे टी-शर्ट के रूप में भी प्राप्त कर सकते हैं;) catonmat.net/blog/my-favorite-regex
SamGoody

1
नोट चेतावनी में प्रलेखन : " और । ऑपरेटरों बाइट के लिहाज से फैशन में काम करते हैं, तो वे मल्टी-बाइट सुरक्षित नहीं हैं और बहु बाइट वर्ण सेट के साथ अप्रत्याशित परिणाम उत्पन्न कर सकते में इसके अलावा, इन ऑपरेटरों को उनके बाइट मूल्यों के आधार पर पात्रों की तुलना और उच्चारण वर्णों की तुलना नहीं की जा सकती है, भले ही किसी दिए गएREGEXPRLIKE
टकराने से

1
इसके लिए धन्यवाद। मैं सोच रहा हूँ कि कैसे एक प्रतिस्थापन चरित्र को बदलने के लिए है - जैसे m
mars-o

1
@ मार्स-ओ - काला हीरा एक अमान्य utf8 चरित्र को इंगित करता है। यहाँ
रिक जेम्स

14

उपरोक्त सभी के उदाहरणों में से एक गायब चरित्र समाप्ति वर्ण (\ 0) है। यह MySQL कंसोल आउटपुट के लिए अदृश्य है और उल्लिखित किसी भी प्रश्न के द्वारा खोजा नहीं जा सकता है। इसे खोजने के लिए क्वेरी बस है:

select * from TABLE where COLUMN like '%\0%';

4

सही उत्तर के आधार पर, लेकिन 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 के समान मानों के लिए मैप नहीं है (क्या ऐसा कोई चरित्र कहीं भी अस्तित्व में है?), यह एक गलत सकारात्मक लौटाएगा। अन्यथा, आनंद लें!


1
00-एफएफ में सभी संभावित 8-बिट मान शामिल हैं, जो कि REGEXPजाँच कर रहा है। इसलिए यह हमेशा मैच की गारंटी है। इसके अलावा ^$शायद वह नहीं है जो आप चाहते थे।
रिक जेम्स

निश्चित रूप से सभी 8 बिट वर्णों को खोजने के लिए सबसे अच्छा REGEXP समाधान है, लेकिन CONVERT (col USING charset) समाधान जितना अच्छा नहीं है जो प्रदर्शन वर्णों को एक विशिष्ट charset तक सीमित करते हुए नियंत्रण वर्णों को भी अनुमति देगा।
इयान

1

विशेष वर्ण रिकॉर्ड खोजने के लिए इस क्वेरी का उपयोग करने का प्रयास करें

SELECT *
FROM tableName
WHERE fieldName REGEXP '[^a-zA-Z0-9@:. \'\-`,\&]'

0

@ ज़ेंडे का उत्तर केवल वही था जो एससी और गैर एस्की पात्रों के मिश्रण के साथ कॉलम को कवर करता था, लेकिन इसमें उस समस्याग्रस्त हेक्स चीज़ भी थी। मैंने इसका उपयोग किया:

SELECT * FROM `table` WHERE NOT `column` REGEXP '^[ -~]+$' AND `column` !=''


-2

इस प्रश्न के लिए हम इस विधि का उपयोग कर सकते हैं:

Sql चिड़ियाघर से प्रश्न:
पीटर GRÜNBERG द्वारा जीते गए पुरस्कार के सभी विवरण प्राप्त करें

गैर- ASCII वर्ण

ans: nobel से * सेलेक्ट करें जहाँ विजेता को’P% GR% _% berg ’;


1
सवाल का कनेक्शन कहां है?
निको हसे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.