স্ট্রিংয়ের তুলনা করার সময় স্ক্যালিটি 3 কে কেস সংবেদনশীল হতে সেট করবেন?


305

আমি স্ট্রিং মেলিং দ্বারা sqlite3 ডাটাবেস থেকে রেকর্ড নির্বাচন করতে চাই। তবে আমি যদি যেখানে ক্লোজে '=' ব্যবহার করি, আমি দেখতে পেলাম যে স্ক্যালিটি 3 কেস সংবেদনশীল। কেহ আমাকে কীভাবে সংক্ষিপ্ত সংবেদনশীলতার তুলনা করে স্ট্রিং ব্যবহার করতে পারেন?

উত্তর:


493

আপনি COLLATE NOCASEআপনার SELECTক্যোয়ারিতে ব্যবহার করতে পারেন :

SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE

Additionaly, SQLite, আপনি ইঙ্গিত করতে পারে একটি কলাম ক্ষেত্রে অসংবেদী যখন আপনি নির্দিষ্ট করে সারণি তৈরি হওয়া উচিত collate nocaseকলাম সংজ্ঞা (অন্যান্য অপশন আছে binary(ডিফল্ট) এবং rtrimদেখ এখানে )। আপনি collate nocaseযখন একটি সূচিও তৈরি করেন তখন আপনি নির্দিষ্ট করতে পারেন। উদাহরণ স্বরূপ:

টেবিল পরীক্ষা তৈরি করুন
(
  পাঠ্য_মূল্য পাঠ্য কোলেটের নোকাস
);

পরীক্ষার মানগুলিতে প্রবেশ করান ('এ');
পরীক্ষার মানগুলিতে প্রবেশ করান ('বি');
পরীক্ষার মানগুলিতে প্রবেশ করান ('সি');

সূচী পরীক্ষা তৈরি করুন_পেক্স_ভ্যালু_আইডেক্স
  পরীক্ষায় (টেক্সট_ভ্যালু কোলেটের নোকাস);

জড়িত এক্সপ্রেশনগুলি Test.Text_Valueএখন সংবেদনশীল হওয়া উচিত। উদাহরণ স্বরূপ:

sqlite> টেস্ট থেকে পাঠ্য_ভ্যালু নির্বাচন করুন যেখানে পাঠ্য_ভ্যালু = 'বি';
Text_Value      
----------------
খ               

sqlite> পাঠ্য_ভ্যালু দ্বারা পরীক্ষার ক্রম থেকে পাঠ্য_ভ্যালু নির্বাচন করুন;
Text_Value      
----------------
একজন               
খ               
সি    

sqlite> Text_Value desc এর মাধ্যমে টেস্ট অর্ডার থেকে Text_Value নির্বাচন করুন;
Text_Value      
----------------
সি               
খ               
একজন               

অপটিমাইজারটি কলামে সংবেদনশীল অনুসন্ধান এবং কলামে মিলে যাওয়ার জন্য সূচকটি সম্ভাব্যরূপে ব্যবহার করতে পারে। আপনি এটি explainএসকিউএল কমান্ড ব্যবহার করে পরীক্ষা করতে পারেন , যেমন:

sqlite> টেস্ট থেকে Text_Value নির্বাচন করুন যেখানে Text_Value = 'বি';
অ্যাডার অপকোড পি 1 পি 2 পি 3                               
---------------- -------------- ---------- ---------- ---------------------------------
0 গোটো 0 16                                           
1 পূর্ণসংখ্যা 0 0                                            
2 ওপেনআড 1 3 কী-ইনফো (1, নোকাস)                
3 সেটনাম কলাম 1 2                                            
4 স্ট্রিং 8 0 0 খ                                
5 ইসনুল -1 14                                           
6 মেকেরেকর্ড 1 0 এ                                
7 মেমস্টোর 0 0                                            
8 সরানো 1 14                                           
9 মেমলোড 0 0                                            
10 আইডেক্সজি 1 14 +                                
11 কলাম 1 0                                            
12 কলব্যাক 1 0                                            
13 পরবর্তী 1 9                                            
14 বন্ধ 1 0                                            
15 হলট 0 0                                            
16 লেনদেন 0 0                                            
17 যাচাই করুন 0 4                                            
18 গোটো 0 1                                            
19 নোপ 0 0                                            

20
(পুনরায়) 'কলক নোকস' দিয়ে সারণী তৈরি করার পরে, আমি খেয়াল করেছি যে এটি WHERE নাম = 'কেউ' কলকের নোকাসের চেয়ে অনেক দ্রুত was খুব দ্রুত (প্রায় ছয় থেকে 10 বার, মোটামুটি?)
Defenestration

10
ডকুমেন্টেশন অনুসারে, COLLATE NOCASEক্ষেত্রটিতে ইতিমধ্যে এই কোলেশনটি সংজ্ঞায়িত করা থাকলে সূচকে যুক্ত করার প্রয়োজন হয় না: " ডিফল্ট কল্টিং ক্রম হ'ল তৈরি টেবিল বিবৃতিতে সেই কলামটির জন্য
সংযুক্তি

29
COLLATE NOCASEশুধুমাত্র ASCII পাঠ্য নিয়ে কাজ করবে। আপনার কলামের মানগুলিতে একবার "ফিনস" বা "ভয়েলি" হয়ে গেলে এটি "বাগদত্ত" বা "ভোইলা" এর সাথে মেলে না। আইসিইউ এক্সটেনশন সক্ষম করার পরে, LIKEকেস-সংবেদনশীল হয়ে যায় তাই 'FIANCÉ' LIKE 'fiancé'সত্য, তবে 'VOILA' LIKE 'voilà'এখনও মিথ্যা। এবং আইসিইউ + লাইকের সূচকটি ব্যবহার না করার ক্ষেত্রে একটি অপূর্ণতা রয়েছে, তাই এটি বড় টেবিলগুলিতে ধীর হতে পারে।

বিভাগটি নির্বাচন করুন, যখন ডিভ = 'ব্যর্থ' হন তবে 'ব্যর্থ' অন্যথায় 'পাস' শেষ হয়, * উপরের নম্বর কোটলেট নোকাস থেকে কাজ করা যায় না আমি কি কিছু ভুল করছি?
থান্ডার

7
একটি বিষয় লক্ষণীয় যে আমাকে ছিটকে গেছে: select * from tbl where firstname='john' and lastname='doe' COLLATE NOCASEএটি ক্ষেত্রে সংবেদনশীল হবে lastname। মামলার অবশ হতে firstname, এই লিখুন: select * from tbl where firstname='john' COLLATE NOCASE and lastname='doe'। এটি one এক কলামের সাথে সুনির্দিষ্ট, পুরো whereধারাটি নয়।
জেমস টুমি

148
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE

5
আপনি যদি আমার মত এবং ক্রমানুসারে সাজানো উপর আরো ডকুমেন্টেশন চান, আপনি তা এখানে এই পৃষ্ঠাতে পেতে পারবেন: sqlite.org/datatype3.html শুধু # 6.0 নিচে স্ক্রোল করুন
উইল

47

আপনি এটি এর মতো করতে পারেন:

SELECT * FROM ... WHERE name LIKE 'someone'

(এটা না সমাধান, কিন্তু কিছু ক্ষেত্রে খুব সুবিধাজনক)

" LIKE অপারেটর একটি প্যাটার্নের সাথে মিলের তুলনা করে। ডানদিকে অপরেন্ডে প্যাটার্ন রয়েছে, বাম হাতের অপারেণ্ডে প্যাটার্নের সাথে মিলের জন্য স্ট্রিং রয়েছে pattern স্ট্রিংয়ের অক্ষরসমূহ the প্যাটার্নের একটি আন্ডারস্কোর ("_") স্ট্রিংয়ের যে কোনও একক অক্ষরের সাথে মেলেঅন্য কোনও অক্ষর নিজেই বা তার ছোট / বড় অংশের সাথে সমান (যেমন কেস-সংবেদনশীল মিলে যায়)মেলে g ASCII অক্ষরগুলির জন্য উচ্চ / নিম্নতর ক্ষেত্রে। LIKE অপারেটরটি ASCII ব্যাপ্তির বাইরে থাকা ইউনিকোড অক্ষরের ক্ষেত্রে সংবেদনশীল exampleমিথ্যা।)


@ এমএম-বিবি হ্যাঁ, আমরা যদি কোনও কলামে পছন্দ না করে কল বা নোট হিসাবে ঘোষণা করা (বা সূচিযুক্ত) না করি তবে এটি সারিগুলির একটি সম্পূর্ণ স্ক্যান করবে scan
নিক ডানডৌলাকিস

1
এটি কোনও বাগ নয়, এটি একটি নথিভুক্ত সীমাবদ্ধতা। উত্তরে উদ্ধৃত একই পৃষ্ঠাতে আইসিইউ সম্প্রসারণের কথা উল্লেখ করা হয়েছে যা ইউনিকোড অক্ষর পরিচালনা করে। (সম্ভবত এটি 2009 এর ক্ষেত্রে হয়নি)
স্টেনসি

40

এটি স্ক্লাইটের সাথে নির্দিষ্ট নয় তবে আপনি এটি করতে পারেন

SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')

পারফরম্যান্স উদ্বেগের অন্য অংশটি হ'ল টেবিলের সাথে মিল থাকা সারিগুলি। এসকিউএলাইট 3 কি কার্য-ভিত্তিক সূচকগুলি সমর্থন করে? এই জাতীয় পরিস্থিতিতে অনুসন্ধান কলাম বা এক্সপ্রেশন (যেমন "UPPER (নাম)") সূচীকরণ করা ভাল ধারণা।
চেদুয়ার্ডো

13
চেডুয়ার্ডো ইঙ্গিত হিসাবে এটির সাথে নজর রাখুন, এসকিউএলাইট এই কোয়েরিটি চালানোর সময় 'নামে' কোনও সূচক ব্যবহার করতে পারে না। ডিবি ইঞ্জিনকে সমস্ত 'সারণি' ক্ষেত্রকে আপার ক্ষেত্রে রূপান্তর করতে এবং তুলনা চালাতে সমস্ত সারি পূর্ণ স্ক্যান করতে হবে।
ম্যাথিউ ওয়াটারস

1
@ পরিমাণ, হ্যাঁ, অনেক।
বার্গা

4

আরেকটি বিকল্প হ'ল আপনার নিজস্ব কাস্টম কলেজ তৈরি করা to এরপরে আপনি কলামটি কলামে সেট করতে পারেন বা এটি আপনার নির্বাচিত অনুচ্ছেদে যুক্ত করতে পারেন। এটি অর্ডার এবং তুলনা জন্য ব্যবহৃত হবে।

এটি 'VOILA' লাইক 'voilà' তৈরি করতে ব্যবহার করা যেতে পারে।

http://www.sqlite.org/capi3ref.html#sqlite3_create_collation

কোলিং ফাংশনটি অবশ্যই একটি পূর্ণসংখ্যা ফেরত পাঠাতে হবে যা negativeণাত্মক, শূন্য বা ধনাত্মক হয় যদি প্রথম স্ট্রিং যথাক্রমে দ্বিতীয়টির চেয়ে কম, সমান বা তার চেয়ে বড় হয়।


2

অন্য একটি বিকল্প যা আপনার ক্ষেত্রে বোধগম্য বা না বুঝতে পারে তা হ'ল আপনার বিদ্যমান কলামটির প্রাক-নিম্ন-সংক্ষিপ্ত মানগুলির সাথে একটি পৃথক কলাম থাকতে হবে। এটি এসকিউএলাইট ফাংশন ব্যবহার করে পপুলেটেড করা যায় LOWER()এবং তারপরে আপনি এই কলামটির পরিবর্তে ম্যাচটি সম্পাদন করতে পারেন।

স্পষ্টতই, এটি অপ্রয়োজনীয়তা এবং অসঙ্গতির সম্ভাবনার যোগ করে, তবে যদি আপনার ডেটা স্থির থাকে তবে এটি একটি উপযুক্ত বিকল্প হতে পারে।


2

সহজভাবে, আপনি আপনার নির্বাচন প্রশ্নে কলট নোকস ব্যবহার করতে পারেন:

SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE

1

যদি কলামটি প্রকারের হয় charতবে আপনার ফাঁকা জায়গাগুলির সাহায্যে অনুসন্ধান করা মানটি যুক্ত করতে হবে, দয়া করে এখানে এই প্রশ্নটি দেখুন । এটি ব্যবহারের পাশাপাশি COLLATE NOCASEবা অন্য সমাধানগুলির একটির (উপরের (), ইত্যাদি) যোগ করুন।


0

আপনি টেবিল ভেলগুলির সাথে সম্পর্কিত স্ট্রিংটির তুলনা করার জন্য এই জাতীয় কোয়েরিটি ব্যবহার করতে পারেন।

টেবিল_নাম থেকে কলামের নাম নির্বাচন করুন যেখানে কলামের নাম যেমন 'সম্পর্কিত তুলনা মান';


এই স্বল্পতা অ্যাড কিছু stackoverflow.com/a/973665/2462516 যা 2009 পোস্ট করা হয়েছে
umasudhan

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