এমএসএসকিউএল সার্ভারের সাথে কি লাইক অপারেটর কেস-সংবেদনশীল?


101

ইন মত অপারেটর সম্পর্কে ডকুমেন্টেশন , কিছুই এটি কেস-সংবেদনশীলতা সম্পর্কে বলা হয়। তাই কি? কীভাবে এটি সক্ষম / অক্ষম করবেন?

আমি যদি varchar(n)কোনও মাইক্রোসফ্ট এসকিউএল সার্ভার 2005 ইনস্টলসে কলামগুলি জিজ্ঞাসা করছি if


14
এটি আপনার কলামের (বা ডাটাবেস) কোলেশন উপর নির্ভর করে। যদি এটি সংবেদনশীল ক্ষেত্রে হয় তবে LIKEকেস সংবেদনশীল, যদি তা না হয় তবে LIKEতা নয়
লামাক

এসকিউএল সার্ভার collations সম্পর্কে ডকুমেন্টেশন চেক msdn.microsoft.com/en-us/library/ms144250%28v=sql.105%29.aspx
GarethD

তোমার লক্ষ্য কি? আপনি কি এটি কেস সংবেদনশীল হতে চান, না কেস সংবেদনশীল হতে চান?
অ্যারন বারট্রান্ড

4
কেস সংবেদনশীলতা কলামে কোলেশন ডিফল্ট হয় যা ডাটাবেসের একটিতে ডিফল্ট হয়। এটি বেশিরভাগ রাউন্ডেবল হয়ে যায়, আপনি কোন পথে যেতে চান?
টনি হপকিনসন

উত্তর:


104

এটি কেস সংবেদনশীল এমন অপারেটর নয়, এটি নিজেই কলাম।

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

sql_latin1_general_cp1_ci_asকলামের লিখিত সামগ্রী কীভাবে আচরণ করা উচিত তা নির্ধারণ করে like সিআই হ'ল কেস সংবেদনশীল এবং এএস এর উচ্চারণ সংবেদনশীল।

কোলেশনগুলির একটি সম্পূর্ণ তালিকা https://msdn.microsoft.com/en-us/library/ms144250(v=sql.105).aspx এ উপলব্ধ

(ক) একটি উদাহরণ কোলেশন চেক করা

select serverproperty('collation')

(খ) ডাটাবেস কোলেশন পরীক্ষা করা

select databasepropertyex('databasename', 'collation') sqlcollation

(গ) আলাদা কোলেশন ব্যবহার করে একটি ডাটাবেস তৈরি করা

create database exampledatabase
collate sql_latin1_general_cp1_cs_as 

(d) একটি পৃথক কোলেশন ব্যবহার করে একটি কলাম তৈরি করা

create table exampletable (
    examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null
)

(ঙ) একটি কলামের সমষ্টি পরিবর্তন করতে

alter table exampletable
alter column examplecolumn varchar(10) collate sql_latin1_general_cp1_ci_as null

একটি দৃষ্টান্ত এবং ডাটাবেস কলেশন পরিবর্তন করা সম্ভব তবে এটি পূর্বে নির্মিত বস্তুগুলিকে প্রভাবিত করে না।

স্ট্রিং তুলনা করার জন্য ফ্লাইতে একটি কলামের সংযোগ পরিবর্তন করাও সম্ভব, তবে এটি উত্পাদন পরিবেশে অত্যন্ত প্রস্তাবিত নয় কারণ এটি অত্যন্ত ব্যয়বহুল।

select
  column1 collate sql_latin1_general_cp1_ci_as as column1
from table1

6
মনে হচ্ছে অক্ষরের পরিসীমা [A-Z]সর্বদা ক্ষেত্রে সংবেদনশীল নয়। [ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ]তবে মনে হয় এটি জোটবদ্ধতা মানছে।
jumxozizi

4
এছাড়াও, আপনি এই জাতীয় কিছু দিয়ে একটি নির্দিষ্ট কলামের কেস সংবেদনশীলতা সম্পর্কে জিজ্ঞাসা করতে পারেন:select COLLATION_NAME, iif(cast(COLLATIONPROPERTY(COLLATION_NAME, 'ComparisonStyle') as int) & 1 = 0, 'case sensitive', 'case insensitive') from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'exampletable' and COLUMN_NAME = 'examplecolumn'
জেপ্প স্টিগ

@ জুমক্সোজিজি আমি আপনার পরামর্শটি উত্তরে যুক্ত করেছি।
জন জাব্রোস্কি

@ জেপ্পস্টিগনিয়েলসন আমি আপনার পরামর্শটি উত্তরে যুক্ত করেছি।
জন জাব্রোস্কি

20

কোলেশন সম্পর্কে এই সমস্ত আলোচনা কিছুটা জটিল বলে মনে হচ্ছে। কেন কেবল এমন কিছু ব্যবহার করবেন না:

IF UPPER(@@VERSION) NOT LIKE '%AZURE%'

তারপরে আপনার চেকটি কোলেশন যাই হোক না কেন সংবেদনশীল


10
কারণ এটি ব্যস্ত নয়। আপনার উদাহরণটি একটি চলক এবং একটি শীর্ষস্থানীয় ওয়াইল্ডকার্ড ব্যবহার করে। তবে কোনও সংবেদনশীল সংযোগের সাথে সূচিত কলামের বিপরীতে like 'a%'সূচকটি ব্যবহার করতে পারে এবং upperসংস্করণটি পারেনি।
মার্টিন স্মিথ

4
প্রশ্নটি ছিল likeঅপারেটর কেস সংবেদনশীল কিনা ।
jumxozizi

আপনার কোলেশন জানতে হবে, অন্যথায় এটি করা অর্থহীন হতে পারে। উদাহরণস্বরূপ, যদি কলামটি ব্যবহারের বিরুদ্ধে জিজ্ঞাসা করা হচ্ছে Latin1_General_CI_AS, তবে করছেন UPPER(@@VALUE) NOT LIKE '%SOMETHING%'বা @@COLUMN NOT LIKE '%SOMETHING%'অপ্রাসঙ্গিক: ফলাফল একই হবে।
rsenna

13

আপনার টেবিলটি সংজ্ঞায়িত করার সময় আপনার কাছে কোলেশন অর্ডার সংজ্ঞায়িত করার বিকল্প রয়েছে। আপনি যদি কেস-সংবেদনশীল আদেশ সংজ্ঞায়িত করেন তবে আপনার LIKEঅপারেটর কেস-সংবেদনশীল উপায়ে আচরণ করবে; আপনি যদি কেস-সংবেদনশীল কোলেশন অর্ডার সংজ্ঞায়িত করেন তবে LIKEঅপারেটর চরিত্রের কেসটিকেও উপেক্ষা করবে:

CREATE TABLE Test (
    CI_Str VARCHAR(15) COLLATE Latin1_General_CI_AS -- Case-insensitive
,   CS_Str VARCHAR(15) COLLATE Latin1_General_CS_AS -- Case-sensitive
);

এখানে স্ক্যালফিল্ডের সাথে একটি তাত্ক্ষণিক ডেমো যা অনুসন্ধানগুলিতে কোলেশন ক্রমের ফলাফল দেখায় LIKE


12

আপনি যদি কলাম / ডাটাবেস / সার্ভারের কোলেশন পরিবর্তন না করে কেস সংবেদনশীল অনুসন্ধান অর্জন করতে চান তবে আপনি সর্বদা COLLATEদফাটি ব্যবহার করতে পারেন , উদাহরণস্বরূপ

USE tempdb;
GO
CREATE TABLE dbo.foo(bar VARCHAR(32) COLLATE Latin1_General_CS_AS);
GO
INSERT dbo.foo VALUES('John'),('john');
GO
SELECT bar FROM dbo.foo 
  WHERE bar LIKE 'j%';
-- 1 row

SELECT bar FROM dbo.foo 
  WHERE bar COLLATE Latin1_General_CI_AS LIKE 'j%';
-- 2 rows

GO    
DROP TABLE dbo.foo;

অন্যদিকেও কাজ করে, যদি আপনার কলাম / ডাটাবেস / সার্ভারটি কেস সংবেদনশীল এবং আপনি কোনও কেস সংবেদনশীল অনুসন্ধান চান না, যেমন

USE tempdb;
GO
CREATE TABLE dbo.foo(bar VARCHAR(32) COLLATE Latin1_General_CI_AS);
GO
INSERT dbo.foo VALUES('John'),('john');
GO
SELECT bar FROM dbo.foo 
  WHERE bar LIKE 'j%';
-- 2 rows

SELECT bar FROM dbo.foo 
  WHERE bar COLLATE Latin1_General_CS_AS LIKE 'j%';
-- 1 row

GO
DROP TABLE dbo.foo;

গত ক্যোয়ারীতে সাবধান যদি আপনি ব্যবহার WHERE bar COLLATE Latin1_General_CS_AS LIKE '[j-k]%'এটা ফিরে আসবে Johnএই কোলেশন রাজধানী হিসেবে Jছোট হাতের মধ্যে jএবং ছোট হাতের k। এটি aAbBcC...jJkKlLmM...এমনটি যা স্পষ্ট নয়। মনে Latin1_General_BINহয় ডাব্লু / লাইক অপারেটরের সাথে রেঞ্জ অনুসন্ধানগুলি আরও অনুমানযোগ্য।
wqw

7

likeঅপারেটর দুটি স্ট্রিং লাগে। এই স্ট্রিংগুলির সামঞ্জস্যপূর্ণ কোলেশন থাকতে হবে, যা এখানে ব্যাখ্যা করা হয়েছে

আমার মতে জিনিসগুলি তখন জটিল হয়ে যায়। নিম্নলিখিত কোয়েরিটি ত্রুটি করে বলেছে যে এই জোটগুলি বেমানান:

select *
from INFORMATION_SCHEMA.TABLES
where 'abc' COLLATE SQL_Latin1_General_CP1_CI_AS like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS

এখানে একটি এলোমেলো মেশিনে, ডিফল্ট কোলেশন হয় SQL_Latin1_General_CP1_CI_AS। নিম্নলিখিত ক্যোয়ারী সফল, কিন্তু কোনও সারি দেয় না:

select *
from INFORMATION_SCHEMA.TABLES
where 'abc' like 'ABC' COLLATE SQL_Latin1_General_CP1_CS_AS

"অ্যাবিসি" এবং "এবিসি" মানগুলি কোনও কেস-সংবেদনশীল বিশ্বে মেলে না।

অন্য কথায়, কোনও কোলেশন না থাকা এবং ডিফল্ট কোলেশন ব্যবহারের মধ্যে পার্থক্য রয়েছে। যখন একপাশে কোনও জোট নেই, তখন এটি অন্য পক্ষের একটি সুস্পষ্ট সমাহার "অ্যাসাইনড" করা হয়।

(ফলাফলগুলি সমান হয় যখন স্পষ্টত জোট বাঁদিকে থাকে))


আপনি কি কোনও টেবিলের বিরুদ্ধে ত্রুটিটি পুনরুত্পাদন করতে পারেন যা INFORMATION_SCHEMA.TABLES এর মতো কোনও সিস্টেম অবজেক্ট নয়?
অ্যারন বারট্রান্ড

@ অ্যারোনবার্ট্র্যান্ড । । হ্যা আমি পারি. ডাটাবেসটি কি ভাঙ্গা;)?
গর্ডন লিনফ

জানেন না, আমি এখনই একটি মোবাইল ডিভাইসে আছি এবং একটি উইন্ডোজ ভিএম স্পিন করতে পারছি না। আমি কেবল জানি না যে আপনার সম্পূর্ণ বিবরণটি প্রযুক্তিগতভাবে সঠিক।
অ্যারন বারট্রান্ড



0

আপনি মাইক্রোসফ্ট এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে সহজে কোলেশন পরিবর্তন করতে পারেন।

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