আমি কীভাবে মাইএসকিউএল-তে ASCII অক্ষরগুলি খুঁজে পেতে পারি?


124

আমি একটি মাইএসকিউএল ডাটাবেস নিয়ে কাজ করছি যা এক্সেল থেকে কিছু ডেটা আমদানি করে । ডেটাতে অ- এসসিআইআই অক্ষর (এম ড্যাশস ইত্যাদি) পাশাপাশি লুকানো ক্যারেজ রিটার্ন বা লাইন ফিড রয়েছে। মাইএসকিউএল ব্যবহার করে এই রেকর্ডগুলি খুঁজে পাওয়ার কোনও উপায় আছে?


8
অলি জোনসের আরও ভাল উত্তর রয়েছে (নীচে চেক করুন)।
জোনাথন আর্কেল

1
@ জোনাথন আর্কেল আর নীচে নেই :)
ব্রিলিয়ান্ড

সংশোধন .. মাঝখানে পরীক্ষা! ;)
জোনাথন আর্কেল

এই হয় উত্তর @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.,-]';

মাইএসকিউএল ডকুমেন্টেশনের সর্বাধিক প্রাসঙ্গিক পৃষ্ঠাটি সম্ভবত 12.5.2 নিয়মিত এক্সপ্রেশন হয়


3
আপনি হাইফেন এবং পিরিয়ড এড়ানো উচিত নয়? (যেহেতু তাদের একটি নিয়মিত অভিব্যক্তির বিশেষ অর্থ রয়েছে)) টেবিলের নাম থেকে * নির্বাচন করুন যেখানে কলামটি নেই ToCheck REGEXP '[A-Za-z0-9,।, \ -]';
টুনি

3
@ টুনি নো, একটি সেটের অভ্যন্তরে একটি সময়কালের অর্থ কেবল নিজের এবং ড্যাশটির অন্যান্য অক্ষরের মধ্যে বিশেষ অর্থ রয়েছে। সেট শেষে, এর অর্থ কেবল নিজেরাই।
মাইকেল স্পিড 21

10
এই ক্যোয়ারীটি কেবল টেবিলনেমে সমস্ত রেখাগুলি সন্ধান করে যা কোনও বর্ণানুক্রমিক অক্ষর ধারণ করে না। এটি প্রশ্নের উত্তর দেয় না।
রব বেইলি

8
এটি এমন কলামগুলির জন্য যেগুলির কোনও আসকি অক্ষর নেই so জেন্ডে থেকে নীচের উত্তরটি এক বা একাধিক অ-অসি অক্ষরগুলির জন্য পরীক্ষা করে। এটি আমাকে বেশিরভাগ অংশে সহায়তা করেছিলSELECT * FROM tbl WHERE colname NOT REGEXP '^[A-Za-z0-9\.,@&\(\) \-]*$';
ফ্রাঙ্ক ফোর্টাল

1
এটি কেবল (আমার পক্ষে) সেই স্ট্রিংগুলি সন্ধান করতে কাজ করে যা এই অক্ষরগুলির মধ্যে কোনটি নেই। এটিতে ASCII এবং অ- ASCII অক্ষরগুলির মিশ্রণযুক্ত স্ট্রিংগুলি খুঁজে পাওয়া যায় না।
ইয়ান

236

মাইএসকিউএল একটি বিস্তৃত অক্ষর সেট পরিচালনা সরবরাহ করে যা এই ধরণের সমস্যার সাথে সহায়তা করতে পারে।

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
এটি এই সমস্যার একটি দুর্দান্ত সমাধান এবং আরও অনেক দৃust়।
ক্রেগডগলাস

5
অ্যাকসেন্ট (ä ä ইত্যাদি) বা এনকোডিংয়ের সাথে সম্পর্কিত নয় এমন চরিত্রগুলি সহ এটি অনুসন্ধান করতেও দরকারী
গ্লাসনহস্ট অক্টোব

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 )
18

15
-1 এটি ভ্রান্ত ফলাফল দিতে পারে। ধরুন, উদাহরণস্বরূপ, এটির একটিতে ইউটিএফ -16 কলাম রয়েছে 'ā'(বাইট ক্রম দ্বারা এনকোডড 0x0101) - এটি এই পরীক্ষাটি ব্যবহার করে "ASCII" হিসাবে বিবেচিত হবে: একটি মিথ্যা নেতিবাচক ; প্রকৃতপক্ষে, কিছু অক্ষর সেট মধ্যে সঙ্কেতাক্ষরে লিখা ASCII অক্ষর না 0x00করতে 0x7fযাহার ফলে এই সমাধান একটি মিথ্যা ইতিবাচক উত্পাদ হবে। এই উত্তর উপর নির্ভর করবেন না!
উদ্বিগ্ন

2
@ সান: এটি কোনও উপকারে আসে না - অনেকগুলি চরিত্রের সেটগুলি নির্দিষ্ট দৈর্ঘ্যের হয় এবং তাই মান নির্বিশেষে LENGTH(column)স্থির একাধিক হবে CHAR_LENGTH(column)
উদ্বিগ্ন

49

আপনি সম্ভবত এটিই খুঁজছেন:

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

এটি এমন সমস্ত সারি ফিরিয়ে আনতে হবে যেখানে COLUMN- এ ASCII অক্ষর রয়েছে (বা মুদ্রণযোগ্য ASCII অক্ষর যেমন নিউলাইন)।


7
আমার জন্য দুর্দান্ত কাজ করে "regexp '[^ - ~]'" এর অর্থ এমন একটি অক্ষর রয়েছে যা স্থানের আগে "" বা "~" বা ASCII 32 - 126 এর পরে থাকে All সমস্ত বর্ণ, সংখ্যা এবং চিহ্ন, তবে কোনও ছাপিয়ে যায় না।
জোশ

আপনি এটি টি-শার্ট হিসাবেও পেতে পারেন;) catonmat.net/blog/my- loversite
সামগুডি

1
উল্লেখ্য সতর্কবাণী মধ্যে ডকুমেন্টেশন : " এবং । অপারেটার বাইট ভিত্তিক ফ্যাশন কাজ, তাই তারা বহু-বাইট নিরাপদ নয় এবং মাল্টি-বাইট অক্ষর সেট সঙ্গে অপ্রত্যাশিত ফলাফল তৈরি করতে পারে সংযোজন, এই পরিচালকরা নিজ নিজ এলাকায় বাইট মান দ্বারা অক্ষর তুলনা এবং উচ্চারণযুক্ত চরিত্রগুলি সমান হিসাবে তুলনা নাও করতে পারে যদি কোনও প্রদত্ত কলেজ তাদের সমান হিসাবে বিবেচনা করে। "REGEXPRLIKE
উদয়জাল

1
এর জন্য ধন্যবাদ. আমি ভাবছি কীভাবে প্রতিস্থাপনের চরিত্রটি প্রতিস্থাপন করা যায় - যেমন â
মঙ্গল-ও

1
@ মার্স-ও - কালো হীরাটি একটি অবৈধ utf8 চরিত্রকে নির্দেশ করে। এখানে
রিক জেমস

14

উপরের প্রত্যেকের উদাহরণগুলির মধ্যে একটি অনুপস্থিত চরিত্র হ'ল সমাপ্তি চরিত্র (\ 0)। এটি মাইএসকিউএল কনসোল আউটপুটটিতে অদৃশ্য এবং এখানে পূর্বে উল্লিখিত কোয়েরির দ্বারা এটি আবিষ্কারযোগ্য নয়। এটির অনুসন্ধানের অনুসন্ধানটি কেবল:

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

4

সঠিক উত্তরের ভিত্তিতে, তবে ASCII নিয়ন্ত্রণের অক্ষরগুলিও বিবেচনায় নেওয়া, আমার জন্য যে সমাধানটি কাজ করেছিল তা হ'ল:

SELECT * FROM `table` WHERE NOT `field` REGEXP  "[\\x00-\\xFF]|^$";

এটি একই জিনিসটি করে: একটি কলামে এএসসিআইআই ব্যাপ্তির লঙ্ঘন অনুসন্ধান করে, তবে আপনাকে নিয়ন্ত্রণের অক্ষরগুলিও অনুসন্ধান করতে দেয়, কারণ এটি কোড পয়েন্টগুলির জন্য হেক্সাডেসিমাল স্বরলিপি ব্যবহার করে। যেহেতু কোনও তুলনা বা রূপান্তর নেই (@ অলির উত্তরের বিপরীতে), এটিও খুব দ্রুত হওয়া উচিত। (বিশেষত যদি মাইএসকিউএল রেগেক্স ক্যোয়ারিতে প্রারম্ভিক-সমাপ্তি করে, যা এটি অবশ্যই হওয়া উচিত))

এটি শূন্য-দৈর্ঘ্যের ক্ষেত্রগুলি ফিরিয়ে এড়িয়ে যায়। আপনি যদি কিছুটা দীর্ঘতর সংস্করণ চান যা আরও ভাল পারফর্ম করতে পারে তবে আপনি এটির পরিবর্তে এটি ব্যবহার করতে পারেন:

SELECT * FROM `table` WHERE `field` <> "" AND NOT `field` REGEXP  "[\\x00-\\xFF]";

এটি কোনও রেজেক্স পাসের জন্য বিবেচনা না করে শূন্য-দৈর্ঘ্যের ফলাফল এড়াতে দৈর্ঘ্যের জন্য পৃথক চেক করে। আপনার শূন্য-দৈর্ঘ্যের এন্ট্রিগুলির উপর নির্ভর করে এটি উল্লেখযোগ্যভাবে দ্রুততর হতে পারে।

মনে রাখবেন যে যদি আপনার ডিফল্ট অক্ষর সেটটি উদ্ভট কিছু হয় যেখানে 0x00-0xFF ASCII এর মতো মানগুলিতে ম্যাপ না করে (কোথাও কোথাও এমন চরিত্র সেট আছে?), এটি একটি মিথ্যা ইতিবাচক প্রত্যাবর্তন করবে। অন্যথায়, উপভোগ করুন!


1
00-এফএফ-তে সমস্ত সম্ভাব্য 8-বিট মান অন্তর্ভুক্ত রয়েছে যা যা REGEXPচেক করছে। অতএব এটি সর্বদা মেলাতে গ্যারান্টিযুক্ত। এছাড়াও ^$সম্ভবত আপনি চেয়েছিলেন নয়।
রিক জেমস

সমস্ত 8 বিট অক্ষর সন্ধানের জন্য অবশ্যই সেরা REGEXP সমাধান তবে কনভার্ট (কল ব্যবহারের চারসেট) সমাধানের মতো ভাল নয় যা ডিসপ্লে অক্ষরগুলিকে নির্দিষ্ট অক্ষরে সীমাবদ্ধ করার সময় নিয়ন্ত্রণের অক্ষরও মঞ্জুরি দেয়।
ইয়ান

1

বিশেষ চরিত্রের রেকর্ড অনুসন্ধানের জন্য এই ক্যোয়ারীটি ব্যবহার করে দেখুন

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

0

@ জেন্ডির উত্তরটি কেবলমাত্র একমাত্র যা কলামগুলিকে আসকি এবং অ এসকিআই অক্ষরগুলির মিশ্রণ দিয়ে কভার করেছিল, তবে এতে সমস্যাযুক্ত হেক্স জিনিসও ছিল। আমি এটি ব্যবহার করেছি:

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


-2

এই প্রশ্নের জন্য আমরা এই পদ্ধতিটিও ব্যবহার করতে পারি:

স্কয়ার চিড়িয়াখানা থেকে প্রশ্ন:
স্কয়ার পিটার গ্রানবার্ব জিতেছে পুরষ্কারের সমস্ত বিবরণ সন্ধান করুন

নন-এএসসিআইআই অক্ষর

উত্তর: নোবেল থেকে * নির্বাচন করুন যেখানে '% জিআর% _% বার্গ' এর মতো বিজয়ী;


1
প্রশ্নের সংযোগ কোথায়?
নিকো হাজে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.