2011-04-13 14 views
21

MySQL डिफ़ॉल्ट कॉलेशन के तहत सभी स्ट्रिंग तुलनाओं को बहुत अधिक चलाता है ... REPLACE कमांड को छोड़कर। मेरे पास केस-असंवेदनशील संयोजन है और इसे केस-असंवेदनशील REPLACE चलाने की आवश्यकता है। केस-सेंसिटिव तुलना करने के बजाए मौजूदा collation का उपयोग करने के लिए REPLACE को मजबूर करने का कोई तरीका है? मैं अपने MySQL (वर्तमान में 5.1 चल रहा है) के उन्नयन के लिए अतिरिक्त कार्यक्षमता प्राप्त करने के लिए तैयार हूँ ...MySQL में केस-असंवेदनशील प्रतिस्थापन?

mysql> charset utf8 collation utf8_unicode_ci; 
Charset changed 

mysql> select 'abc' like '%B%'; 
+------------------+ 
| 'abc' like '%B%' | 
+------------------+ 
|    1 | 
+------------------+ 

mysql> select replace('aAbBcC', 'a', 'f'); 
+-----------------------------+ 
| replace('aAbBcC', 'a', 'f') | 
+-----------------------------+ 
| fAbBcC      | <--- *NOT* 'ffbBcC' 
+-----------------------------+ 

उत्तर

16

तो replace(lower()) काम नहीं करता है, तो आप एक मौखिक के लिए another function.

+6

मैं मूल स्ट्रिंग के गैर प्रतिस्थापित शेष के मामले को संरक्षित करने, इसलिए कोई जरूरत है। – dkarp

+0

अद्यतन repSchedule सेट ईमेल = प्रतिस्थापन (लोअर (ईमेल), '@ xyz.com', '@ xxyyzz.co.uk') – zzapper

+0

लिंक में फ़ंक्शन मुझे चाहिए! धन्यवाद! –

4

वैकल्पिक समारोह बनाने की आवश्यकता होगी fvox द्वारा।

DELIMITER | 
CREATE FUNCTION case_insensitive_replace (REPLACE_WHERE text, REPLACE_THIS text, REPLACE_WITH text) 
RETURNS text 
DETERMINISTIC 
BEGIN 
    DECLARE last_occurency int DEFAULT '1'; 

    IF LCASE(REPLACE_THIS) = LCASE(REPLACE_WITH) OR LENGTH(REPLACE_THIS) < 1 THEN 
     RETURN REPLACE_WHERE; 
    END IF; 

    WHILE Locate(LCASE(REPLACE_THIS), LCASE(REPLACE_WHERE), last_occurency) > 0 DO 
     BEGIN 
     SET last_occurency = Locate(LCASE(REPLACE_THIS), LCASE(REPLACE_WHERE)); 
     SET REPLACE_WHERE = Insert(REPLACE_WHERE, last_occurency, LENGTH(REPLACE_THIS), REPLACE_WITH); 
     SET last_occurency = last_occurency + LENGTH(REPLACE_WITH); 
     END; 
    END WHILE; 
    RETURN REPLACE_WHERE; 
END; 
| 
DELIMITER ; 

छोटे परीक्षण:

SET @str = BINARY 'New York'; 
SELECT case_insensitive_replace(@str, 'y', 'K'); 

उत्तर: New Kork

0

मैं http://pento.net/2009/02/15/case-insensitive-replace-for-mysql/ साथ चला गया (fvox के जवाब में) जो केस संवेदी प्रतिस्थापन के साथ और के मामले को बदले बिना केस संवेदी खोज करता है क्या खोजी गई स्ट्रिंग में कहीं और अप्रभावित वर्ण होना चाहिए।

एनबी। टिप्पणी उसी पृष्ठ पर और बताती है कि CHAR (255) को VARCHAR (255) में बदला जाना चाहिए - यह मेरे लिए भी आवश्यक था।

0

लुइस्ट के उत्तर में यह संशोधन सुई के अलग-अलग संस्करण वाले संस्करण (दो लाइनों में परिवर्तन) के साथ सुई को प्रतिस्थापित करने की अनुमति देता है।

DELIMITER | 
CREATE FUNCTION case_insensitive_replace (REPLACE_WHERE text, REPLACE_THIS text, REPLACE_WITH text) 
RETURNS text 
DETERMINISTIC 
BEGIN 
    DECLARE last_occurency int DEFAULT '1'; 

    IF LENGTH(REPLACE_THIS) < 1 THEN 
    RETURN REPLACE_WHERE; 
    END IF; 

    WHILE Locate(LCASE(REPLACE_THIS), LCASE(REPLACE_WHERE), last_occurency) > 0 DO 
    BEGIN 
     SET last_occurency = Locate(LCASE(REPLACE_THIS), LCASE(REPLACE_WHERE), last_occurency); 
     SET REPLACE_WHERE = Insert(REPLACE_WHERE, last_occurency, LENGTH(REPLACE_THIS), REPLACE_WITH); 
     SET last_occurency = last_occurency + LENGTH(REPLACE_WITH); 
    END; 
    END WHILE; 
    RETURN REPLACE_WHERE; 
END; 
| 
DELIMITER ; 
0

पिछले जवाब में, और pento.net लिंक, LOCATE() तर्क कम मामलों रहे हैं।

यह, के रूप में ढूँढें केस-संवेदी डिफ़ॉल्ट रूप से संसाधनों की बर्बादी है:

mysql> select locate('el', 'HELLo'); 
+-----------------------+ 
| locate('el', 'HELLo') | 
+-----------------------+ 
|      2 | 
+-----------------------+ 

आप

WHILE Locate(REPLACE_THIS, REPLACE_WHERE, last_occurency) > 0 DO

आदि के साथ

WHILE Locate(LCASE(REPLACE_THIS), LCASE(REPLACE_WHERE), last_occurency) > 0 DO

जगह ले सकता है

0

'विशेष' अक्षर के मामले में वहाँ अप्रत्याशित व्यवहार है:

SELECT case_insensitive_replace('A', 'Ã', 'a') 

देता

a 

कौन सा अप्रत्याशित है ...के बाद से हम केवल एक बदलना चाहते हैं नहीं एक

क्या और भी अधिक अजीब है:

SELECT LOCATE('Ã', 'A'); 

देता

0 

कौन सा सही परिणाम है ... एन्कोडिंग के साथ क्या करना है लगता है संग्रहीत प्रक्रिया के पैरामीटर के ...

1

मेरा 2 सेंट।

चूंकि कई लोगों ने MySQL से मारियाडीबी तक अपग्रेड किया है, इसलिए उन लोगों को REGEXP_REPLACE नामक एक नया फ़ंक्शन उपलब्ध होगा। इसका उपयोग करें क्योंकि आप एक सामान्य प्रतिस्थापन करेंगे, लेकिन पैटर्न एक नियमित अभिव्यक्ति है।

यह एक काम कर उदाहरण है:

UPDATE `myTable` 
SET `myField` = REGEXP_REPLACE(`myField`, '(?i)my insensitive string', 'new string') 
WHERE `myField` REGEXP '(?i)my insensitive string' 

विकल्प (?i) बाद के सभी मैचों मामले बनाता असंवेदनशील (अगर पैटर्न की शुरुआत में डाल दिया है कि मैं तो यह सब असंवेदनशील है)।

अधिक जानकारी के लिए यहाँ देखें: https://mariadb.com/kb/en/mariadb/pcre/

+1

इस विशेष मामले में 'जहां ...' भाग सख्ती से जरूरी नहीं है, क्योंकि फ़ंक्शन केवल एक मैच कहां से बदल जाएगा, लेकिन मैंने सोचा कि यह ध्यान रखना अच्छा होगा कि regexp का उपयोग * कहां * में किया जा सकता है । बीटीडब्ल्यू, regexp * जहां * स्थितियों को सादा mysql में समर्थित है, लेकिन regexp_replace नहीं है। –

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