'कहाँ' में उच्चारणों को अनदेखा करें


17

हमारे डेटाबेस में हमारे पास caron / hatschek के साथ कई प्रविष्टियाँ हैं। जब हमारे उपयोगकर्ता बिना एंट्री के खोज करते हैं तो वे कैरन / हैटशेक सहित प्रविष्टियाँ खोजना चाहते हैं। मैं इसे एक साधारण उदाहरण से दिखाता हूँ:

हमारे डेटाबेस में हमारी प्रविष्टि (नाम के साथ संपर्क) है

Millière

इसलिए यह नाम उस देश में सही है जहां व्यक्ति रहता है।

हमारे देश में हमारे पास caron / hatschek के साथ कोई वर्ण नहीं है, इसलिए हमारा उपयोगकर्ता खोज करता है Milliere। कोई परिणाम नहीं आता है, जैसा èकि स्पष्ट रूप से मेल नहीं खाता है e

मैं पता नहीं है कि यह कैसे के रूप में महसूस किया जा सकता है é, è, êऔर कई और अधिक उपलब्ध हैं (और यह केवल पत्र के लिए एक उदाहरण है e...)।

(दूसरा तरीका बहुत आसान होगा, क्योंकि मैं बस सभी अक्षरों को कैरन / हाटशेक के साथ बुनियादी एक के साथ बदल सकता हूं। जाहिर है, हमारे उपयोगकर्ता डेटाबेस में नाम का सही संस्करण चाहते हैं, अपंग नहीं।


नोट करें कि "è" में कैरन / हेक नहीं है, यह एक गंभीर उच्चारण है; एक कैरन / हसेक "on" होगा। क्या आपका मतलब है "उच्चारण के साथ वर्ण" या ऐसा कुछ? या क्या आप विशेष रूप से कैरन / हेसक उच्चारण का मतलब है?
भजन

मेरा मतलब है "संकेत" के साथ किसी भी वर्ण (क्षमा करें, मुझे इसके लिए वास्तविक नाम नहीं पता है।
लुमो

जवाबों:


31

उच्चारण असंवेदनशील टकराव का उपयोग करके इस समस्या को हल किया जा सकता है ।

आपका डेटाबेस संभवतः AS (Accent Sensitive) समतलीकरण का उपयोग कर रहा है, इसलिए डिफ़ॉल्ट रूप से यह लहजे सहित सटीक मिलान की खोज करेगा।

आप तुलना के साथ टकराव को निर्दिष्ट करके डेटाबेस डिफ़ॉल्ट की तुलना में एक और टकराव का उपयोग करने के लिए WHERE क्लॉज़ को निर्देश दे सकते हैं।

में इस dbfiddle मैं एक उदाहरण latin1 collations उपयोग कर बनाई गई हैं, लेकिन आप मिलान तुम सिर्फ मिलान अपने स्तंभ वर्तमान में उपयोग कर रहा है के लिए में ऐ के रूप में बदल कर प्रयोग कर रहे हैं के साथ एक ही दृष्टिकोण का उपयोग कर सकते हैं।

एक्सेंट इंसेंटिव कोलाजेशन का उपयोग करें जो कोलम के उपयोग से मेल खाता है। उदाहरण के लिए, यदि स्तंभ का उपयोग किया जाता है SQL_Latin1_General_CP1_CI_AS, तो उपयोग करें या SQL_Latin1_General_CP1_CI_AIनहीं Latin1_General_CI_ASया Latin1_General_100_CI_ASउन दोनों में से कोई भी भिन्नता नहीं है क्योंकि गैर-SQL_ कोलाजेशन का व्यवहार केवल उच्चारण-असंवेदनशीलता की तुलना में अधिक तरीकों से भिन्न होगा, और यह उपयोगकर्ताओं द्वारा अपेक्षित नहीं हो सकता है।

आप वर्तमान टकराव की जांच कर सकते हैं sys.columns

CREATE TABLE testaccent (name nvarchar(50));
GO
INSERT INTO testaccent (name) VALUES ('Millière') , ('Milliere');
GO
-- returns Miliere
SELECT * FROM testaccent WHERE name = 'Milliere';

-- returns both
SELECT * FROM testaccent WHERE name='Milliere' COLLATE Latin1_General_CI_AI

--only returns Miliere
SELECT * FROM testaccent WHERE name='Milliere' COLLATE Latin1_General_CI_AS

अधिक जानकारी के लिए SQL सर्वर Collations का उपयोग करके पढ़ें ।

तो फिर आप शायद इस कोलाज का उपयोग करना चाहते हैं (जैसा कि peufeu ने टिप्पणियों में उल्लेख किया है) यह सुनिश्चित करने के लिए कि "e" "e" के साथ सॉर्ट करें। अन्यथा, कोई व्यक्ति जो वर्णमाला के क्रम में परिणामों से गुजरता है, तो "é" को नहीं पाकर आश्चर्यचकित हो जाएगा, जहां वे उनसे होने की उम्मीद करते हैं, लेकिन यदि आप केवल इस क्वेरी को छूना चाहते हैं, तो आप COLLATEक्लॉज को ORDER BYभी जोड़ सकते हैं ।

जैसा कि टिप्पणियों में सोलोमन रुट्ज़की ने कहा है , यदि यह केवल 1 या कुछ कॉलम को प्रभावित करता है, तो एक और विकल्प एक गैर-निरंतर कम्प्यूटेड कॉलम बनाना है जो केवल "नाम" कॉलम को दोहराता है और उच्चारण असंवेदनशील टकराव प्रदान करता है, और फिर गणना को अनुक्रमित करता है। स्तंभ। यह क्वेरी के भीतर टकराव को बदलने के कारण स्कैन से बचा जाता है। फिर क्वेरी को नए कॉलम पर फ़िल्टर करने की आवश्यकता है।

कुछ इस तरह:

ALTER TABLE 
dbo.[table_name] ADD [SearchName] datatype_of_name_column 
AS ([Name] COLLATE LATIN1_GENERAL_100_CI_AI)); 

CREATE INDEX [IX_table_name_SearchName] 
ON dbo.[table_name] ([SearchName] ASC);

या आप एक संगणित कॉलम (जैसा कि joi पसंद करते हैं) को जोड़ने के बजाय एक दृश्य भी बना सकते हैं ।


1
टॉम: मैं ध्यान दूंगा (और हाइलाइट) कि उन्हें कॉलेशन के एक्सेंट-असंवेदनशील संस्करण का उपयोग करना चाहिए जो स्तंभ का उपयोग कर रहा है (डेटाबेस 3 में उल्लिखित डिफ़ॉल्ट डिफॉल्टेशन, इस प्रश्न के लिए प्रासंगिक नहीं है)। यदि स्तंभ का उपयोग SQL_Latin1_General_CP1_CI_AS, उपयोग SQL_Latin1_General_CP1_CI_AIऔर नहीं किया जाता है Latin1_General_CI_ASया Latin1_General_100_CI_ASउन दोनों में से कोई भी भिन्नता नहीं है, तो गैर- SQL_टकराव के व्यवहार में केवल उच्चारण-असंवेदनशीलता की तुलना में अधिक तरीके से भिन्न होंगे, और यह उपयोगकर्ताओं द्वारा अपेक्षित नहीं हो सकता है। में पाया जाता है sys.columns
सोलोमन रटज़की

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