MSSQL सर्वर के साथ LIKE ऑपरेटर केस-संवेदी है?


99

LIKE ऑपरेटर के बारे में प्रलेखन में , इसके बारे में केस-सेंसिटिविटी के बारे में कुछ भी नहीं बताया गया है। क्या यह? इसे सक्षम / अक्षम कैसे करें?

मैं varchar(n)एक Microsoft SQL Server 2005 स्थापना पर कॉलम को क्वेरी कर रहा हूं , अगर यह मायने रखता है।


14
यह आपके कॉलम (या डेटाबेस) के टकराने पर निर्भर करता है। यदि यह संवेदनशील है, तो LIKEमामला संवेदनशील है, यदि यह नहीं है, तो LIKEनहीं है
लामक


आपका लक्ष्य क्या है? क्या आप चाहते हैं कि यह मामला संवेदनशील हो, या मामला संवेदनशील न हो?
हारून बर्ट्रेंड

1
केस सेंसिटिविटी उस कॉलम पर टकराने के लिए डिफॉल्ट करती है, जो डेटाबेस पर मौजूद डिफॉल्ट करता है। यह ज्यादातर गोल हो जाता है, आप किस रास्ते पर जाना चाहते हैं?
टोनी हॉपकिंसन

जवाबों:


101

यह संचालक नहीं है जो मामले के प्रति संवेदनशील है, यह स्वयं स्तंभ है।

जब 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

5
ऐसा लगता है कि वर्णों की श्रेणी [A-Z]हमेशा केस-असंवेदनशील होती है। [ABCDEFGHIJKLMNOPQRSŠTUVWXYZŽÅÄÖ]हालांकि टकराव का पालन करने के लिए लगता है।
jumxozizi

1
इसके अलावा, आप किसी विशेष कॉलम की केस सेंसिटिविटी को कुछ इस तरह से क्वेरी कर सकते हैं: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'
जेपी स्टिग नील्सन

@jumxozizi मैंने आपके सुझाव को उत्तर में जोड़ दिया।
जॉन ज़ब्रोस्की

@JeppeStigNielsen मैंने आपके सुझाव को उत्तर में जोड़ दिया।
जॉन ज़ब्रोस्की

18

टकराव के बारे में यह सब बात थोड़ी जटिल लगती है। सिर्फ कुछ का उपयोग क्यों न करें:

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

फिर आपका चेक मामला चाहे जो भी हो, असंवेदनशील है


10
क्योंकि यह व्यंग्य नहीं है। आपका उदाहरण एक चर और एक प्रमुख वाइल्डकार्ड का उपयोग करता है। लेकिन एक असंवेदनशील टकराव के साथ अनुक्रमित स्तंभ के विरुद्ध like 'a%'सूचकांक का उपयोग किया जा सकता है और upperसंस्करण नहीं कर सकता।
मार्टिन स्मिथ

3
सवाल यह था कि likeऑपरेटर संवेदनशील है या नहीं ।
जुमेक्सोज़ी

आपको कोलाज को जानने की आवश्यकता है, अन्यथा ऐसा करना व्यर्थ हो सकता है। उदाहरण के लिए, यदि स्तंभों का उपयोग किए जाने के खिलाफ किया जा रहा है Latin1_General_CI_AS, तो ऐसा करना UPPER(@@VALUE) NOT LIKE '%SOMETHING%'या @@COLUMN NOT LIKE '%SOMETHING%'अप्रासंगिक है: परिणाम समान होगा।

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है कि श्रेणी खोजों w / LIKE ऑपरेटर के साथ अधिक पूर्वानुमान है।
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 जैसी सिस्टम ऑब्जेक्ट नहीं है?
हारून बर्ट्रेंड

@AaronBertrand । । हाँ मैं कर सकता हूँ। डेटाबेस टूट गया है;)
गॉर्डन लिनॉफ़

पता नहीं, मैं अभी एक मोबाइल डिवाइस पर हूं और Windows VM को स्पिन नहीं कर सकता। मुझे अभी पता नहीं है कि आपका पूरा विवरण तकनीकी रूप से सटीक है।
हारून बर्ट्रेंड

4

चलाने की कोशिश करो,

SELECT SERVERPROPERTY('COLLATION')

फिर पता करें कि आपका कोलाज संवेदनशील है या नहीं।



0

आप Microsoft SQL सर्वर प्रबंधन स्टूडियो में कोलाज को आसानी से बदल सकते हैं।

  • राइट क्लिक टेबल -> डिज़ाइन।
  • अपने कॉलम को चुनें, मैं कॉलम के गुण संपत्तियों को नीचे स्क्रॉल करें।
  • "केस सेंसिटिव" चेक द्वारा अपनी क्रमबद्ध वरीयता निर्धारित करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.