কেইন সংবেদনশীল স্ট্রিংটি লিনকুই-এসকিউএল-তে তুলনা করে


137

আমি পড়েছি যে কেস-সংবেদনশীল স্ট্রিং তুলনা সম্পাদনের জন্য টুপার এবং টোলভার ব্যবহার করা বুদ্ধিমানের নয়, তবে লিনিক-টু-এসকিউএল করার সময় আমি কোনও বিকল্প দেখতে পাচ্ছি না। স্ট্রিং.কম্পিয়ারের উপেক্ষা কেস এবং তুলনাআপনি যুক্তিগুলি লিনিকিউ-টু-এসকিউএল দ্বারা উপেক্ষা করা হয় (আপনি যদি কেস-সংবেদনশীল ডাটাবেস ব্যবহার করেন তবে আপনি কেস-সংবেদনশীল তুলনা জিজ্ঞাসা করলেও আপনি কেস-সংবেদনশীল তুলনা পাবেন)। ToLower বা ToUpper এখানে সেরা বিকল্প? এক অন্য চেয়ে ভাল? আমি ভেবেছিলাম যে আমি কোথাও পড়েছি যে টুপার ভাল ছিল, তবে আমি জানি না যে এটি এখানে প্রযোজ্য কিনা। (আমি প্রচুর কোড রিভিউ করছি এবং প্রত্যেকে টোলওয়ার ব্যবহার করছে।)

Dim s = From row In context.Table Where String.Compare(row.Name, "test", StringComparison.InvariantCultureIgnoreCase) = 0

এটি এমন একটি এসকিউএল কোয়েরিতে অনুবাদ করে যা কেবল সারিটির তুলনা করে। নামটিকে "পরীক্ষার" সাথে তুলনা করে এবং কেস-সংবেদনশীল ডাটাবেসে "টেস্ট" এবং "টেস্ট" ফিরিয়ে দেয় না।


1
ধন্যবাদ! এটি আজ আমার পাছাটিকে সত্যই রক্ষা করেছে। নোট: এটা খুব মত অন্যান্য LINQ এক্সটেনশনগুলি সাথে কাজ করে LINQQuery.Contains("VaLuE", StringComparer.CurrentCultureIgnoreCase)এবং LINQQuery.Except(new string[]{"A VaLUE","AnOTher VaLUE"}, StringComparer.CurrentCultureIgnoreCase)। Wahoo!
গ্রেগ ব্রে

মজার বিষয়, আমি কেবলমাত্র পড়তে পেরেছি যে এই উত্স থেকে তুলনা করার ক্ষেত্রে টুঅপার আরও ভাল ছিল: এমএসডিএন.মাইক্রোসফট
en

উত্তর:


110

যেমনটি আপনি বলেছেন, টুউপার এবং টুলওয়ারের মধ্যে কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে এবং আপনি যখন কেস সংবেদনশীল সাম্যতা পরীক্ষা করতে চেষ্টা করছেন তখন কেবলমাত্র নির্ভরযোগ্য accurate

আদর্শভাবে, একটি কেস-অবশ সমতা চেক করতে সবচেয়ে ভালো উপায় হবে :

String.Equals(row.Name, "test", StringComparison.OrdinalIgnoreCase)

দ্রষ্টব্য, তবে এই ক্ষেত্রে এটি কাজ করে না ! অতএব আমরা আটকে আছে ToUpperবা ToLower

এটিকে সুরক্ষিত-সুরক্ষিত করার জন্য অর্ডিনাল উপেক্ষা করুনকে নোট করুন । তবে সংবেদনশীল চেকটি ব্যবহারের ক্ষেত্রে ঠিক কী ধরণের প্রয়োজন তা নির্ভর করে আপনার উদ্দেশ্যগুলি কী। তবে সাধারণভাবে সমতা যাচাইয়ের জন্য সমান ব্যবহার করুন এবং আপনি বাছাই করার সময় তুলনা করুন এবং তারপরে কাজের জন্য সঠিক স্ট্রিংক্যাম্পিয়ার বেছে নিন।

মাইকেল ক্যাপলান (সংস্কৃতি এবং চরিত্র পরিচালনা সম্পর্কিত স্বীকৃত কর্তৃপক্ষ) এর টুঅপার বনাম টোলওয়ার সম্পর্কিত সম্পর্কিত পোস্ট রয়েছে:

তিনি বলেছেন "স্ট্রিং.টুঅপার - টোলওয়ারের চেয়ে টুপার ব্যবহার করুন এবং ওএস কেসিংয়ের নিয়মগুলি বেছে নেওয়ার জন্য ইনভারিয়েন্ট কালচার নির্দিষ্ট করুন "


1
দেখে মনে হচ্ছে এটি এসকিউএল সার্ভারের জন্য প্রযোজ্য নয়: উপরের মুদ্রণ ('গ্রোস স্ট্রেই') গ্রোথ স্ট্রাইটি প্রদান করে
ব্লুমোনকএমএন

1
এছাড়াও, আপনি সরবরাহ করেছেন যে নমুনা কোডটি এমএস এসকিউএল 2005 ডাটাবেসে লিনকিউ-টু-এসকিউএল এর মাধ্যমে চালিত হওয়ার সময় আমি যতটা কোড কেস-সংবেদনশীল হিসাবে প্রদান করেছি ঠিক তেমনই সমস্যা রয়েছে।
ব্লুমোনকএমএন

2
আমি রাজী. দুঃখিত আমি অস্পষ্ট ছিলাম। আমি যে নমুনা কোড সরবরাহ করেছি তা লিনক 2 এসকিউএল এর সাথে কাজ করে না আপনি যেমনটি আপনার মূল প্রশ্নটিতে উল্লেখ করেছেন। আমি কেবল বিশ্রাম নিচ্ছিলাম যে আপনি যেভাবে শুরু করেছেন সেটি হ'ল দুর্দান্ত উপায় if যদি কেবলমাত্র এই দৃশ্যে এটি কাজ করে। এবং হ্যাঁ, অন্য মাইক ক্যাপলান সোপবক্সটি হ'ল এসকিউএল সার্ভারের অক্ষর পরিচালনা সমস্ত জায়গাতেই place আপনার যদি সংবেদনশীল সংবেদন দরকার হয় এবং এটি অন্য কোনও উপায়ে পেতে না পারেন, আমি প্রস্তাব দিচ্ছিলাম (অস্পষ্টভাবে) যে আপনি ডেটা বড় হাতের হিসাবে সংরক্ষণ করুন এবং তারপরে এটিকে বড় হাতের হিসাবে জিজ্ঞাসা করুন।
অ্যান্ড্রু আরনট

3
ঠিক আছে, আপনার যদি কেস সংবেদনশীল ডাটাবেস থাকে এবং আপনি মিশ্র ক্ষেত্রে সংরক্ষণ করেন এবং উচ্চতর ক্ষেত্রে সন্ধান করেন তবে আপনি মিল পাবেন না। যদি আপনি আপনার অনুসন্ধানে ডেটা এবং ক্যোয়ারী উভয়ই আপস করেন তবে আপনি প্রতিটি ক্যোয়ারীর জন্য সন্ধান করছেন এমন সমস্ত পাঠ্য রূপান্তর করছেন যা কোনও পারফর্মেন্ট নয়।
অ্যান্ড্রু অরনট

1
@ ব্লুমোনকএমএন, আপনি কি নিশ্চিত যে আপনি সঠিক স্নিপেটগুলি পেস্ট করেছেন? এটি বিশ্বাস করা শক্ত যে এমএসএসকিউএল সার্ভার কালো রঙের চেয়ে লালকে বেশি পছন্দ করে।
গ্রীনল্ডম্যান

75

আমি System.Data.Linq.SqlClient.SqlMethods.Like(row.Name, "test") আমার জিজ্ঞাসা ব্যবহার করেছি।

এটি একটি কেস-সংবেদনশীল তুলনা সম্পাদন করে।


3
হা! এখন বেশ কয়েক বছর ধরে লিনক 2 স্কোয়েল ব্যবহার করা হচ্ছে তবে এখন পর্যন্ত স্কেলমেথডগুলি দেখা হয়নি, ধন্যবাদ!
কার্ল হারবার্গ

3
উজ্জ্বল! যদিও আরও বিশদ ব্যবহার করতে পারে। এটি কি লাইকের প্রত্যাশিত ব্যবহারগুলির মধ্যে একটি? এমন কোনও সম্ভাবনা রয়েছে যা মিথ্যা ইতিবাচক ফলাফলের কারণ হতে পারে? নাকি মিথ্যা নেতিবাচক ফল? এই পদ্ধতিতে ডকুমেন্টেশনের অভাব রয়েছে, লাইক পদ্ধতির ক্রিয়াকলাপটি বর্ণনা করবে এমন নথিটি কোথায় ?
টাস্ক

2
আমি মনে করি এটি কেবল এসকিউএল সার্ভারের সাথে স্ট্রিংগুলির তুলনা করে, যা সম্ভবত কোথাও কনফিগারযোগ্য on
অ্যান্ড্রু ডেভি

11
System.Data.Linq.SqlClient.SqlMethods.Like (রো.নাম, "পরীক্ষা") সারি হিসাবে একই। নাম ont কনটেইনস ("পরীক্ষা")। অ্যান্ড্রু যেমন বলছে, এটি স্কিএল সার্ভারের কলেজের উপর নির্ভর করে। সুতরাং লাইক (বা থাকা) সর্বদা কেস-সংবেদনশীল তুলনা সম্পাদন করে না।
দোকম্যান

3
সচেতন থাকুন, এটি কোডটি খুব বেশি জোড় করে SqlClient
জয়দার

5

আমি ল্যাম্বদা এক্সপ্রেশন ব্যবহার করে এটি চেষ্টা করেছি এবং এটি কার্যকর হয়েছে।

List<MyList>.Any (x => (String.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase)) && (x.Type == qbType) );


18
এটা এ কারণে যে আপনি একটি ব্যবহার করছেন এর List<>যার মানে তুলনা ইন-মেমরি (C # এর কোড) সঞ্চালিত বদলে একটি IQueryable(বা ObjectQuery) যা তুলনা পড়তেন ডাটাবেসের মধ্যে
drzaus

1
@Drzaus কি বলেছে। এই উত্তরটি কেবল ভুল, বিবেচনা করে যে প্রসঙ্গটি লিনাক 2 এসকিএল, এবং নিয়মিত লিনক নয়।
rsenna

0

আপনি যদি লাইনকিউ-এসকিউএল-তে সংবেদনশীল একটি স্ট্রিং পাস করেন তবে এটি এসকিউএল অপরিবর্তিত হয়ে যাবে এবং তুলনাটি ডাটাবেসে ঘটবে। আপনি যদি ডাটাবেসে কেস-সংবেদনশীল স্ট্রিংয়ের তুলনা করতে চান তবে আপনাকে যা করতে হবে তা হল ল্যাম্বডা এক্সপ্রেশন তৈরি করা যা তুলনা করে এবং লিনকুই-টু-এসকিউএল সরবরাহকারী সেই স্ট্রিংটি আপনার স্ট্রিং অক্ষত রেখে একটি এসকিউএল কোয়েরিতে অনুবাদ করবে।

উদাহরণস্বরূপ এই লিনকিউ ক্যোয়ারী:

from user in Users
where user.Email == "foo@bar.com"
select user

লিনকিউ-এস -কিউএল সরবরাহকারীর দ্বারা নিম্নলিখিত এসকিউএল-তে অনুবাদ করা হয়েছে:

SELECT [t0].[Email]
FROM [User] AS [t0]
WHERE [t0].[Email] = @p0
-- note that "@p0" is defined as nvarchar(11)
-- and is passed my value of "foo@bar.com"

আপনি দেখতে পাচ্ছেন, স্ট্রিং প্যারামিটারটি এসকিউএলে তুলনা করা হবে যার অর্থ জিনিসগুলি যেভাবে আপনি প্রত্যাশা করেছিলেন ঠিক সেভাবে কাজ করা উচিত।


আপনি কি বলছেন তা আমি বুঝতে পারছি না। 1) স্ট্রিংগুলি নিজেরাই। নেট এ কেস-সংবেদনশীল বা কেস-সংবেদনশীল হতে পারে না, তাই আমি "কেস-সংবেদনশীল স্ট্রিং" পাস করতে পারি না। 2) একটি লিনকিউ ক্যোয়ারী মূলত ল্যাম্বডা এক্সপ্রেশন এবং আমি এইভাবে আমার দুটি স্ট্রিং পার করছি, সুতরাং এটি আমার কাছে কোনও অর্থবোধ করে না।
ব্লুমোনকএমএন

3
আমি একটি CASE- সংবেদনশীল ডাটাবেসে একটি CASE-INSENSITIVE তুলনা সম্পাদন করতে চাই।
ব্লুমোনকএমএন

আপনি কোন CASE-SENSITIVE ডাটাবেস ব্যবহার করছেন?
অ্যান্ড্রু হরে

এছাড়াও, একটি লিনকিউ ক্যোয়ারী ল্যাম্বডা এক্সপ্রেশন নয়। একটি লিনকিউ কোয়েরি বেশ কয়েকটি অংশ নিয়ে গঠিত (বিশেষত ক্যোয়ারী অপারেটর এবং ল্যাম্বদা এক্সপ্রেশন)।
অ্যান্ড্রু হরে

এই উত্তরটি ব্লুমোনকএমএন মন্তব্য হিসাবে অর্থবোধ করে না।
আলফ

0

সংক্ষিপ্ত লিঙ্ক থেকে এসকিএল ক্যোরিয়াস সম্পাদন করতে নীচের একটি ব্যবহার করে সার্ভার ডেটা টাইপ নির্দিষ্ট করে 'স্ট্রিং' ক্ষেত্রগুলিকে কেস সেনসিটিভ বলে ঘোষণা করে;

varchar(4000) COLLATE SQL_Latin1_General_CP1_CS_AS 

অথবা

nvarchar(Max) COLLATE SQL_Latin1_General_CP1_CS_AS

দ্রষ্টব্য: উপরের কোলেশন ধরণের 'সিএস' এর অর্থ 'কেস সংবেদনশীল'।

ভিজুয়াল স্টুডিও ডিবিএমএল ডিজাইনার ব্যবহার করে কোনও সম্পত্তি দেখার সময় এটি "সার্ভার ডেটা টাইপ" ক্ষেত্রে প্রবেশ করা যেতে পারে।

আরও তথ্যের জন্য দেখুন http://yourdotnetdesignteam.blogspot.com/2010/06/case-sensitive-linq-to-sql-queries.html


এটাই সমস্যা। সাধারণত আমি যে ক্ষেত্রটি ব্যবহার করি তা কেস সেনসিটিভ (রাসায়নিক সূত্র সিও [কার্বন মনোক্সাইড] কো [কোবাল্ট] থেকে পৃথক)। তবে, একটি নির্দিষ্ট পরিস্থিতিতে (অনুসন্ধান) আমি কো এবং সিও উভয়ের সাথে মিল রাখতে চাই। একটি ভিন্ন "সার্ভার ডেটা টাইপ" দিয়ে একটি অতিরিক্ত সম্পত্তি সংজ্ঞায়িত করা বৈধ নয় (লিনাক থেকে এসকিউএল কেবলমাত্র প্রতি বর্গ কলামে একটি সম্পত্তি দেয়)। সুতরাং এখনও কোন যেতে।
দোকম্যান

এছাড়াও, যদি ইউনিট টেস্টিং করা হয়, তবে এই পদ্ধতির কোনও ডেটা মকের সাথে তুলনাযোগ্য হবে না। গৃহীত উত্তরে লিনক / ল্যাম্বদা পদ্ধতির ব্যবহার সেরা।
ডেরিক

0
where row.name.StartsWith(q, true, System.Globalization.CultureInfo.CurrentCulture)

1
এটি এসকিউএল পাঠ্য কী যার মধ্যে এটি অনুবাদ হয় এবং এটি কোনও এসকিউএল পরিবেশে সংবেদনশীল হতে দেয় যা অন্যথায় কেস-সংবেদনশীল হিসাবে বিবেচনা করবে?
BlueMonkMN

0

নিম্নলিখিত 2-পর্যায়ে পদ্ধতির আমার জন্য কাজ করে (VS2010, ASP.NET MVC3, এসকিউএল সার্ভার ২০০৮, লিনক থেকে এসকিউএল):

result = entRepos.FindAllEntities()
    .Where(e => e.EntitySearchText.Contains(item));

if (caseSensitive)
{
    result = result
        .Where(e => e.EntitySearchText.IndexOf(item, System.StringComparison.CurrentCulture) >= 0);
}

1
এই কোডটিতে একটি ত্রুটি রয়েছে যদি পাঠ্যটি অনুসন্ধানের পাঠ্য দিয়ে শুরু হয় (হওয়া উচিত> = 0)
ফ্ল্যাটলাইনার ডিওএ

@ ফ্ল্যাটলাইনার ডিওএ আসলে এটি হওয়া উচিত != -1কারণ IndexOf "চরিত্র বা স্ট্রিংটি পাওয়া না গেলে -1
ফেরায়

0

কখনও কখনও ডাটাবেসে সঞ্চিত মানের মধ্যে ফাঁকা স্থান থাকতে পারে তাই এটি চলমান ব্যর্থ হতে পারে

String.Equals(row.Name, "test", StringComparison.OrdinalIgnoreCase)

এই সমস্যার সমাধান হ'ল স্থান সরিয়ে তার কেস রূপান্তর করে তারপরে এটি নির্বাচন করুন

 return db.UsersTBs.Where(x => x.title.ToString().ToLower().Replace(" ",string.Empty).Equals(customname.ToLower())).FirstOrDefault();

এই ক্ষেত্রে নোট

কাস্টমনামটি ডাটাবেসের সাথে মানটির সাথে মান মিলবে

UsersTBs ক্লাস হয়

শিরোনাম হ'ল ডেটাবেস কলাম


-1

মনে রাখবেন যে ক্যোয়ারীটি কাজ করে কিনা এবং এটি দক্ষতার সাথে কাজ করে কিনা তার মধ্যে পার্থক্য রয়েছে ! বিবৃতিটির লক্ষ্য এসকিউএল সার্ভার হলে একটি লিনকিউ বিবৃতি টি-এসকিউএল রূপান্তরিত হয়, সুতরাং আপনাকে যে টি-এসকিউএল উত্পন্ন হবে তা নিয়ে ভাবতে হবে।

স্ট্রিং.একুয়ালগুলি ব্যবহার করা সম্ভবত (আমি অনুমান করছি) এসকিউএল সার্ভার থেকে সমস্ত সারি ফিরিয়ে আনবে এবং তারপরে .NET এর সাথে তুলনা করবে, কারণ এটি একটি .NET এক্সপ্রেশন যা টি-এসকিউএলে অনুবাদ করা যায় না।

অন্য কথায় একটি এক্সপ্রেশন ব্যবহার করা আপনার ডেটা অ্যাক্সেস বাড়িয়ে তুলবে এবং সূচকগুলি ব্যবহারের আপনার ক্ষমতা সরিয়ে ফেলবে। এটি ছোট টেবিলগুলিতে কাজ করবে এবং আপনি পার্থক্যটি লক্ষ্য করবেন না। একটি বড় টেবিলে এটি খুব খারাপভাবে পারফর্ম করতে পারে।

এটি লিনকিউতে বিদ্যমান একটি সমস্যা; লোকেরা আর কীভাবে তাদের লেখার বিবৃতিগুলি পূর্ণ হবে তা নিয়ে চিন্তা করে না।

এক্ষেত্রে এক্সপ্রেশন ব্যবহার না করে আপনি যা চান তা করার কোনও উপায় নেই - এমনকি টি-এসকিউএল-তেও নয়। অতএব আপনি আরও দক্ষতার সাথে এটি করতে সক্ষম নাও হতে পারেন। এমনকি উপরে বর্ণিত টি-এসকিউএল উত্তর (কোলেশন সহ ভেরিয়েবলগুলি ব্যবহার করে) এর ফলে সূচকগুলি উপেক্ষা করা সম্ভব হয় তবে এটি যদি বড় টেবিল হয় তবে বিবৃতিটি চালানো এবং নির্ধারণের পরিকল্পনার দিকে তাকানো মূল্যবান যে কোনও সূচক ব্যবহৃত হয়েছিল কিনা তা দেখার জন্য execution ।


2
এটি সত্য নয় (এটি ক্লায়েন্টকে সারিগুলি ফেরত দেয় না)। আমি স্ট্রিং.একুয়ালগুলি ব্যবহার করেছি এবং এটি কাজ করে না তার কারণ এটি একটি টিএসকিউএল স্ট্রিং তুলনায় রূপান্তরিত হয়, যার আচরণ ডেটাবেস বা সার্ভারের জোটের উপর নির্ভর করে। আমি সবার জন্য বিবেচনা করি যে আমি যে প্রতিটি লিনকিউকে এসকিউএল এক্সপ্রেশন লিখি সেগুলি কীভাবে টিএসকিউএলে রূপান্তরিত হবে। আমি যা চাই তার উপায় হ'ল উত্পাদিত টিএসকিউএলকে UPPER ব্যবহার করতে বাধ্য করার জন্য ToUpper ব্যবহার করা। তারপরে সমস্ত রূপান্তর এবং তুলনা যুক্তি এখনও টিএসকিউএল এ সম্পন্ন হয় যাতে আপনি খুব বেশি পারফরম্যান্স হারাবেন না।
BlueMonkMN
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.