আমি একটি মাইএসকিউএল ডাটাবেস নিয়ে কাজ করছি যা এক্সেল থেকে কিছু ডেটা আমদানি করে । ডেটাতে অ- এসসিআইআই অক্ষর (এম ড্যাশস ইত্যাদি) পাশাপাশি লুকানো ক্যারেজ রিটার্ন বা লাইন ফিড রয়েছে। মাইএসকিউএল ব্যবহার করে এই রেকর্ডগুলি খুঁজে পাওয়ার কোনও উপায় আছে?
আমি একটি মাইএসকিউএল ডাটাবেস নিয়ে কাজ করছি যা এক্সেল থেকে কিছু ডেটা আমদানি করে । ডেটাতে অ- এসসিআইআই অক্ষর (এম ড্যাশস ইত্যাদি) পাশাপাশি লুকানো ক্যারেজ রিটার্ন বা লাইন ফিড রয়েছে। মাইএসকিউএল ব্যবহার করে এই রেকর্ডগুলি খুঁজে পাওয়ার কোনও উপায় আছে?
উত্তর:
এটি "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 নিয়মিত এক্সপ্রেশন হয় ।
SELECT * FROM tbl WHERE colname NOT REGEXP '^[A-Za-z0-9\.,@&\(\) \-]*$';
মাইএসকিউএল একটি বিস্তৃত অক্ষর সেট পরিচালনা সরবরাহ করে যা এই ধরণের সমস্যার সাথে সহায়তা করতে পারে।
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]|^$";
এটি একই জিনিসটি করে: একটি কলামে এএসসিআইআই ব্যাপ্তির লঙ্ঘন অনুসন্ধান করে, তবে আপনাকে নিয়ন্ত্রণের অক্ষরগুলিও অনুসন্ধান করতে দেয়, কারণ এটি কোড পয়েন্টগুলির জন্য হেক্সাডেসিমাল স্বরলিপি ব্যবহার করে। যেহেতু কোনও তুলনা বা রূপান্তর নেই (@ অলির উত্তরের বিপরীতে), এটিও খুব দ্রুত হওয়া উচিত। (বিশেষত যদি মাইএসকিউএল রেগেক্স ক্যোয়ারিতে প্রারম্ভিক-সমাপ্তি করে, যা এটি অবশ্যই হওয়া উচিত))
এটি শূন্য-দৈর্ঘ্যের ক্ষেত্রগুলি ফিরিয়ে এড়িয়ে যায়। আপনি যদি কিছুটা দীর্ঘতর সংস্করণ চান যা আরও ভাল পারফর্ম করতে পারে তবে আপনি এটির পরিবর্তে এটি ব্যবহার করতে পারেন:
SELECT * FROM `table` WHERE `field` <> "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
এটি কোনও রেজেক্স পাসের জন্য বিবেচনা না করে শূন্য-দৈর্ঘ্যের ফলাফল এড়াতে দৈর্ঘ্যের জন্য পৃথক চেক করে। আপনার শূন্য-দৈর্ঘ্যের এন্ট্রিগুলির উপর নির্ভর করে এটি উল্লেখযোগ্যভাবে দ্রুততর হতে পারে।
মনে রাখবেন যে যদি আপনার ডিফল্ট অক্ষর সেটটি উদ্ভট কিছু হয় যেখানে 0x00-0xFF ASCII এর মতো মানগুলিতে ম্যাপ না করে (কোথাও কোথাও এমন চরিত্র সেট আছে?), এটি একটি মিথ্যা ইতিবাচক প্রত্যাবর্তন করবে। অন্যথায়, উপভোগ করুন!
REGEXP
চেক করছে। অতএব এটি সর্বদা মেলাতে গ্যারান্টিযুক্ত। এছাড়াও ^$
সম্ভবত আপনি চেয়েছিলেন নয়।
ওরাকলে আমরা নীচে ব্যবহার করতে পারি।
SELECT * FROM TABLE_A WHERE ASCIISTR(COLUMN_A) <> COLUMN_A;
এই প্রশ্নের জন্য আমরা এই পদ্ধতিটিও ব্যবহার করতে পারি:
স্কয়ার চিড়িয়াখানা থেকে প্রশ্ন:
স্কয়ার পিটার গ্রানবার্ব জিতেছে পুরষ্কারের সমস্ত বিবরণ সন্ধান করুন
নন-এএসসিআইআই অক্ষর
উত্তর: নোবেল থেকে * নির্বাচন করুন যেখানে '% জিআর% _% বার্গ' এর মতো বিজয়ী;