2010-09-16 21 views
5

इम निम्नलिखित PHP और MySQL का उपयोग कर एक मेज से पंक्तियों को लाने के लिए,पीएचपी/mysql खोज - केस संवेदनशील

$search_word=$_GET['search_word']; 
$search_word_new=mysql_escape_string($search_word); 
$search_word_fix=str_replace(" ","%",$search_word_new); 
$sql=mysql_query("SELECT * FROM tweets WHERE content LIKE '%$search_word_fix%' ORDER BY votes DESC LIMIT 20"); 

'सामग्री' क्षेत्र एक पाठ ट्वीट्स युक्त क्षेत्र है। अगर मैं खोज 'एस tackoverflow' मैं 'Stackoverflow' वाले सभी परिणाम प्राप्त लेकिन कोई परिणाम नहीं पाठ 'रों tackoverflow' है जब

समस्या मेरे पास है

है। असल में खोज केस संवेदनशील है।

क्या क्वेरी या PHP को बदलना संभव है ताकि 'स्टैक ओवरफ्लो' की खोज करते समय दोनों ऊपरी और निचले केस परिणाम लौटाए जाएं?

SELECT * FROM tweets WHERE LOWER(content) LIKE LOWER('%$search_word_fix%') ORDER BY votes DESC LIMIT 20 

या:

उत्तर

4

आप कोशिश कर सकते हैं:

$search_word_fix=strtolower(str_replace(" ","%",$search_word_new)); 
$sql=mysql_query("SELECT * FROM tweets WHERE lower(content) LIKE '%$search_word_fix%' ORDER BY votes DESC LIMIT 20"); 
  • मैंने strtolower को $search_word_fix सभी कम केस बनाने के लिए जोड़ा है।
  • और जहां खंड मैं content बदल दिया है lower(content) करने के लिए इतना है कि मैं content की लोअरकेस के साथ तुलना करें।

आप के रूप में अन्य जवाब में प्रस्तावित क्वेरी में इन दोनों परिवर्तन किए हैं सकता है।

+0

एक PHP नौसिखिया के रूप में मेरे लिए सरल समाधान। – CLiown

+1

सरलतम = = सर्वोत्तम। इससे किसी भी संभावित सूचकांक का कोई फायदा नहीं होगा, और यह काफी धीमी है। (उस भयानक बेवकूफ ने कहा जो वास्तव में इस तथ्य से दुखी था कि किसी को भी MySQL में ओह-आसान-आसान केस-असंवेदनशील संयोजन की परवाह नहीं है)। – Wrikken

3

'उचित' जिस तरह से यह करने के लिए के लिए सेट करने के लिए है केस-संवेदी मिलान:

CREATE TABLE foo (col1 varchar(24) COLLATE utf8_bin,col2 varchar(24) COLLATE utf8_general_ci); 
Query OK, 0 rows affected (0.03 sec) 

DB 5.1.49-1-log:test mysql> INSERT INTO foo VALUES ('stackoverflow','stackoverflow'); 
Query OK, 1 row affected (0.01 sec) 

DB 5.1.49-1-log:test mysql> SELECT * FROM foo WHERE col1 LIKE 'Stackoverflow'; 
Empty set (0.00 sec) 

DB 5.1.49-1-log:test mysql> SELECT * FROM foo WHERE col2 LIKE 'Stackoverflow'; 
+---------------+---------------+ 
| col1   | col2   | 
+---------------+---------------+ 
| stackoverflow | stackoverflow | 
+---------------+---------------+ 
1 row in set (0.00 sec) 

DB 5.1.49-1-log:test mysql> SELECT * FROM foo WHERE col1 COLLATE utf8_general_ci LIKE 'Stackoverflow'; 
+---------------+---------------+ 
| col1   | col2   | 
+---------------+---------------+ 
| stackoverflow | stackoverflow | 
+---------------+---------------+ 
1 row in set (0.00 sec) 
+1

'COLLATE' क्लॉज का उपयोग न करें जब तक आप कॉलम के संयोजन को आसानी से नहीं बदल सकते - आप इंडेक्स का उपयोग नहीं कर सकते। –

0

mysql> चुनें * myDb.myTable से कहां उपयोगकर्ता नाम = 'test980'; सेट में 1 पंक्ति (0.00 सेकंड)

mysql> चुनें * myDb.myTable से उपयोगकर्ता नाम = 'टेस्ट 9 80'; खाली सेट (0.00 सेकंड)

MySQL कॉलम को बाइनरी कीवर्ड के साथ बनाकर केस-सेंसिटिव बनाया जा सकता है। मुझे संदेह है कि यह आपकी समस्या है। आप स्तंभ को संशोधित कर सकते हैं या बाइनरी नहीं बदल सकते हैं:

चुनें * myDb.myTable से जहां यूसीएएसई (उपयोगकर्ता नाम) = 'टेस्ट 9 80';

जो बाइनरी वर्ण सेट के बावजूद प्रभावी ढंग से स्ट्रिंग तुलना केस असंवेदनशील बनाता है।

+0

'बिनरी' और 'यूसीएएसई' महंगा हैं क्योंकि सूचकांक का उपयोग नहीं किया जा सकता है। –

0

यह MySQL डेटाबेस बनाने के दौरान सबसे अच्छा संयोजन चुनने के बारे में है। यदि आप उदाहरण जर्मन चरित्र सही ढंग से सेट के लिए सॉर्ट करने के लिए चाहते हैं, लेकिन यह धीमी है

  • utf8_unicode_ci उपयोगी है।
  • utf8_general_ci डिफ़ॉल्ट रूप से मानक है जब MySQL डेटाबेस वर्ण सेट utf8 बनाते हैं और यह सबसे तेज़ है, लेकिन केस संवेदनशील नहीं है।
  • अंगूठे का नियम: MySQL पर हमेशा utf8_general_ci का उपयोग करें और केस संवेदनशील होने पर utf8_bin को collate करें या अपने कथन में चयन बिनरी का उपयोग करें।
1

बदलें प्रश्न (content) में स्तंभ के COLLATION मामला है, असंवेदनशील ऐसे utf8mb4_unicode_ci के रूप में किया जाना है।

PHP में केस फोल्ड करना महंगा और अक्षम है।

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