LIKE ऑपरेटर के बारे में प्रलेखन में , इसके बारे में केस-सेंसिटिविटी के बारे में कुछ भी नहीं बताया गया है। क्या यह? इसे सक्षम / अक्षम कैसे करें?
मैं varchar(n)एक Microsoft SQL Server 2005 स्थापना पर कॉलम को क्वेरी कर रहा हूं , अगर यह मायने रखता है।
LIKE ऑपरेटर के बारे में प्रलेखन में , इसके बारे में केस-सेंसिटिविटी के बारे में कुछ भी नहीं बताया गया है। क्या यह? इसे सक्षम / अक्षम कैसे करें?
मैं varchar(n)एक Microsoft SQL Server 2005 स्थापना पर कॉलम को क्वेरी कर रहा हूं , अगर यह मायने रखता है।
जवाबों:
यह संचालक नहीं है जो मामले के प्रति संवेदनशील है, यह स्वयं स्तंभ है।
जब SQL सर्वर इंस्टॉलेशन किया जाता है तो डिफ़ॉल्ट कोलाजेशन को उदाहरण के लिए चुना जाता है। जब तक स्पष्ट रूप से अन्यथा उल्लेख नहीं किया जाता है (जब एक नया डेटाबेस बनाया जाता है, तो टकराव की जाँच करें) यह उदाहरण से टकराव को विरासत में मिला है और जब एक नया स्तंभ बनाया जाता है, तो यह उस डेटाबेस से टकराव को विरासत में मिलता है।
एक टकराव की तरह sql_latin1_general_cp1_ci_asयह तय करता है कि स्तंभ की सामग्री का इलाज कैसे किया जाना चाहिए। सीआई मामले के लिए असंवेदनशील है और एएस उच्चारण के लिए संवेदनशील है।
टकराव की एक पूरी सूची https://msdn.microsoft.com/en-us/library/ms144250(v=sql.105).aspx पर उपलब्ध है
(ए) एक उदाहरण टकराव की जाँच करने के लिए
select serverproperty('collation')
(बी) एक डेटाबेस टकराव की जाँच करने के लिए
select databasepropertyex('databasename', 'collation') sqlcollation
(c) एक अलग कोलाजेशन का उपयोग करके डेटाबेस बनाना
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
)
(a) एक स्तंभ टकराव को संशोधित करने के लिए
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है कि श्रेणी खोजों w / LIKE ऑपरेटर के साथ अधिक पूर्वानुमान है।
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')
फिर पता करें कि आपका कोलाज संवेदनशील है या नहीं।
आप Microsoft SQL सर्वर प्रबंधन स्टूडियो में कोलाज को आसानी से बदल सकते हैं।
LIKEमामला संवेदनशील है, यदि यह नहीं है, तोLIKEनहीं है