2013-02-19 26 views
64

documentation about the LIKE operator में, मामले की संवेदनशीलता के बारे में कुछ भी नहीं बताया गया है। क्या यह? इसे सक्षम/अक्षम कैसे करें?क्या LIKE ऑपरेटर केस-संवेदनशील है MSSQL सर्वर के साथ?

मैं माइक्रोसॉफ्ट एसक्यूएल सर्वर 2005 स्थापना पर varchar(n) कॉलम पूछताछ कर रहा हूं, यदि यह मायने रखता है।

+9

यह अपने स्तंभ (या डेटाबेस) का मिलान पर निर्भर करता है। यदि यह मामला संवेदनशील है, तो 'LIKE' केस संवेदनशील है, यदि ऐसा नहीं है, तो' LIKE' – Lamak

+0

SQL-Server collations के बारे में दस्तावेज़ों की जांच करें http://msdn.microsoft.com/en-us/library/ms144250 % 28v = sql.105% 29.aspx – GarethD

+0

आपका लक्ष्य क्या है? क्या आप चाहते हैं कि यह मामला संवेदनशील हो या केस संवेदनशील न हो? –

उत्तर

69

यह ऑपरेटर नहीं है जो केस संवेदनशील है, यह कॉलम ही है।

जब एक SQL सर्वर स्थापना निष्पादित की जाती है तो उदाहरण के लिए एक डिफ़ॉल्ट collation चुना जाता है। जब तक कोई नया डेटाबेस नहीं बनाया जाता है, तब तक स्पष्ट रूप से उल्लिखित नहीं किया जाता है (कोलेट क्लॉज बोले की जांच करें) जब यह एक नया डेटाबेस बनाया जाता है और जब कोई नया कॉलम बनाया जाता है तो यह डेटाबेस से सम्मिलन प्राप्त करता है।

sql_latin1_general_cp1_ci_as जैसे एक संयोजन से पता चलता है कि कॉलम की सामग्री का इलाज कैसे किया जाना चाहिए। सीआई मामले असंवेदनशील है और एएस उच्चारण संवेदनशील के लिए खड़ा है।

collations की एक पूरी सूची उपलब्ध है 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 

(घ) ing एक अलग मिलान

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 

यह एक उदाहरण और डेटाबेस collations बदलने के लिए संभव है, लेकिन यह पहले बनाने को प्रभावित नहीं करता है डी वस्तुओं।

स्ट्रिंग तुलना के लिए फ्लाई पर कॉलम संयोजन को बदलना भी संभव है, लेकिन यह उत्पादन वातावरण में अत्यधिक अनुशंसित है क्योंकि यह बेहद महंगा है।

select 
    column1 collate sql_latin1_general_cp1_ci_as as column1 
from table1 
+2

ऐसा लगता है कि '[ए-जेड]' जैसे वर्णों की श्रृंखला हमेशा केस-असंवेदनशील होती है। '[एबीसीडीएफजीएचजेजेकेएलएमएनओपीक्यूआरएसटीयूयूवीडब्ल्यूएक्सवाईजेएसएएसए]] हालांकि, जमावट का पालन करना प्रतीत होता है। – jumxozizi

+1

इसके अलावा, आप किसी विशेष कॉलम की केस संवेदनशीलता से इस तरह कुछ पूछ सकते हैं: 'COLLATION_NAME, iif (कास्ट (COLLATIONPROPERTY (COLLATION_NAME,' तुलनात्मक स्टाइल ') int के रूप में चुनें) और 1 = 0,' केस संवेदनशील ',' केस असंवेदनशील ') INFORMATION_SCHEMA.COLUMNS से जहां TABLE_NAME =' exampletable 'और COLUMN_NAME =' examplecolumn'' –

2

प्रयास चल रहा है,

SELECT SERVERPROPERTY('COLLATION') 

तब पता लगाना यदि आपके मिलान केस संवेदी है या नहीं।

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 
); 

यहाँ एक quick demo on sqlfiddleLIKE साथ खोजों पर मिलान के आदेश के परिणाम दिखा रहा है।

8

आप स्तंभ/डेटाबेस/सर्वर का मिलान बदले बिना एक केस संवेदी खोज हासिल करना चाहते हैं, तो आप हमेशा 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; 
+0

यदि आप 'WHERE बार COLLATE लैटिन 1_General_CS_AS LIKE' का उपयोग करते हैं तो अंतिम क्वेरी में सावधान रहें [jk]% '' यह 'जॉन' को वापस कर देगा यह संयोजन पूंजी 'जे' लोअरकेस 'जे' और लोअरकेस' के' के बीच है। यह 'एएबीबीसीसी ... जेजेकेकेएलएमएमएम' जैसा है ... जो स्पष्ट नहीं है। ऐसा लगता है कि 'लैटिन 1_General_BIN' श्रेणी की खोज w/LIKE ऑपरेटर के साथ अधिक अनुमानित है। – wqw

3

like ऑपरेटर दो तार लेता है। इन तारों में संगत collations होना चाहिए, जो here समझाया गया है।

मेरी राय में, चीजें जटिल हो जाती हैं। निम्न क्वेरी कह रही है कि collations असंगत हैं एक त्रुटि देता है: यहाँ

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 

मूल्यों "abc" और "एबीसी" एक मामले sensitve दुनिया में मेल नहीं खाते।

दूसरे शब्दों में, कोई संयोजन नहीं है और डिफ़ॉल्ट collation का उपयोग करने के बीच एक अंतर है। जब एक तरफ कोई टक्कर नहीं होती है, तो इसे दूसरी ओर से एक स्पष्ट संयोजन "असाइन किया जाता है"।

(परिणाम एक ही हैं जब स्पष्ट मिलान बाईं ओर है।)

+0

क्या आप उस तालिका के विरुद्ध त्रुटि को पुन: उत्पन्न कर सकते हैं जो INFORMATION_SCHEMA.TABLES जैसी सिस्टम ऑब्जेक्ट नहीं है? –

+0

@AaronBertrand। । । हाँ मैं कर सकता हूँ। क्या डेटाबेस टूटा हुआ है;)? –

+0

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

12

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

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

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

+6

क्योंकि यह व्यवहार्य नहीं है। आपका उदाहरण एक चर और एक अग्रणी वाइल्डकार्ड का उपयोग करता है। लेकिन एक मामले के साथ अनुक्रमित कॉलम के खिलाफ '%' की तरह असंवेदनशील संयोजन 'सूचकांक का उपयोग कर सकता है और' ऊपरी 'संस्करण नहीं कर सका। –

+1

सवाल यह था कि 'जैसे' ऑपरेटर केस संवेदनशील है या नहीं। – jumxozizi

संबंधित मुद्दे