ইন মত অপারেটর সম্পর্কে ডকুমেন্টেশন , কিছুই এটি কেস-সংবেদনশীলতা সম্পর্কে বলা হয়। তাই কি? কীভাবে এটি সক্ষম / অক্ষম করবেন?
আমি যদি varchar(n)
কোনও মাইক্রোসফ্ট এসকিউএল সার্ভার 2005 ইনস্টলসে কলামগুলি জিজ্ঞাসা করছি if
ইন মত অপারেটর সম্পর্কে ডকুমেন্টেশন , কিছুই এটি কেস-সংবেদনশীলতা সম্পর্কে বলা হয়। তাই কি? কীভাবে এটি সক্ষম / অক্ষম করবেন?
আমি যদি varchar(n)
কোনও মাইক্রোসফ্ট এসকিউএল সার্ভার 2005 ইনস্টলসে কলামগুলি জিজ্ঞাসা করছি if
উত্তর:
এটি কেস সংবেদনশীল এমন অপারেটর নয়, এটি নিজেই কলাম।
যখন কোনও এসকিউএল সার্ভার ইনস্টলেশন সঞ্চালিত হয় তখন উদাহরণের জন্য একটি ডিফল্ট কোলেশন চয়ন করা হয়। স্পষ্টভাবে অন্যথায় উল্লেখ না করা (কোলেট ক্লজ বেলো পরীক্ষা করে দেখুন) যখন কোনও নতুন ডাটাবেস তৈরি করা হয় যখন এটি কোলেশনটিকে উদাহরণস্বরূপ উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং যখন একটি নতুন কলাম তৈরি করা হয় তখন এটি এটি সম্পর্কিত ডাটাবেস থেকে কোলেশন উত্তরাধিকার সূত্রে প্রাপ্ত হয়।
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
[A-Z]
সর্বদা ক্ষেত্রে সংবেদনশীল নয়। [ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ]
তবে মনে হয় এটি জোটবদ্ধতা মানছে।
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'
কোলেশন সম্পর্কে এই সমস্ত আলোচনা কিছুটা জটিল বলে মনে হচ্ছে। কেন কেবল এমন কিছু ব্যবহার করবেন না:
IF UPPER(@@VERSION) NOT LIKE '%AZURE%'
তারপরে আপনার চেকটি কোলেশন যাই হোক না কেন সংবেদনশীল
like 'a%'
সূচকটি ব্যবহার করতে পারে এবং upper
সংস্করণটি পারেনি।
like
অপারেটর কেস সংবেদনশীল কিনা ।
Latin1_General_CI_AS
, তবে করছেন UPPER(@@VALUE) NOT LIKE '%SOMETHING%'
বা @@COLUMN NOT LIKE '%SOMETHING%'
অপ্রাসঙ্গিক: ফলাফল একই হবে।
আপনার টেবিলটি সংজ্ঞায়িত করার সময় আপনার কাছে কোলেশন অর্ডার সংজ্ঞায়িত করার বিকল্প রয়েছে। আপনি যদি কেস-সংবেদনশীল আদেশ সংজ্ঞায়িত করেন তবে আপনার 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
।
আপনি যদি কলাম / ডাটাবেস / সার্ভারের কোলেশন পরিবর্তন না করে কেস সংবেদনশীল অনুসন্ধান অর্জন করতে চান তবে আপনি সর্বদা 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
হয় ডাব্লু / লাইক অপারেটরের সাথে রেঞ্জ অনুসন্ধানগুলি আরও অনুমানযোগ্য।
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
"অ্যাবিসি" এবং "এবিসি" মানগুলি কোনও কেস-সংবেদনশীল বিশ্বে মেলে না।
অন্য কথায়, কোনও কোলেশন না থাকা এবং ডিফল্ট কোলেশন ব্যবহারের মধ্যে পার্থক্য রয়েছে। যখন একপাশে কোনও জোট নেই, তখন এটি অন্য পক্ষের একটি সুস্পষ্ট সমাহার "অ্যাসাইনড" করা হয়।
(ফলাফলগুলি সমান হয় যখন স্পষ্টত জোট বাঁদিকে থাকে))
চালানোর চেষ্টা করুন,
SELECT SERVERPROPERTY('COLLATION')
তারপরে আপনার জোটটি কেস সংবেদনশীল কিনা তা খুঁজে বের করুন।
আপনি মাইক্রোসফ্ট এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে সহজে কোলেশন পরিবর্তন করতে পারেন।
LIKE
কেস সংবেদনশীল, যদি তা না হয় তবেLIKE
তা নয়