2011-03-04 6 views
5

MySQL का उपयोग करके, मैं स्पेनिश में गाने की एक सूची का चयन कर रहा हूं जिसे मैं सॉर्ट करना चाहता हूं। यहां क्वेरी द्वारा लौटाए गए नामों की एक सूची दी गई है:mysql या php में utf वर्णों का उपयोग करके सॉर्ट करें? सर्वोत्तम समाधान

  • ¡डेसीरेविला!
  • Alhambra
  • 123 pasitos
  • अफ्रीका
  • Arroz
  • decir

क्रमबद्ध सूची इस तरह दिखना चाहिए:

  • 123 pasitos
  • अफ्रीका
  • +०१२३५१६४१०
  • अलामबरा
  • अररोज
  • ¡डेसीरेविला!
  • decir

अनुसंधान मैं पढ़ा है की सब के बाद, मैं यह निष्कर्ष निकाला गया है कोई उचित तरीका यह MySQL का उपयोग कर प्राप्त करने के लिए नहीं है। मैंने collation, charset, आदि की कोशिश की है ... लेकिन चरित्र वांछित कोई तरीका नहीं है,?, आदि ... मेरे वांछित परिणाम के अनुसार क्रमबद्ध कर सकते हैं। यहां तक ​​कि एए को जिस तरह से मैं चाहता हूं उसे हल नहीं किया गया है ...

प्रश्न 1: क्या यह एक उचित निष्कर्ष है?

मेरा मानना ​​है कि इसे प्राप्त करने का एकमात्र तरीका php में एक सरणी में परिणाम पास कर रहा है और उसके बाद एक कस्टम फ़ंक्शन का उपयोग करके सरणी को सॉर्ट करें ... यह सब फ़ंक्शन यूजर (मूल्य से सॉर्ट करने की आवश्यकता है और मैं नहीं ' मुख्य सहयोग को बनाए रखने के बारे में परवाह नहीं है)। इसके साथ कुछ:

function normalize($a, $b) { 
    if ($a == $b) { 
    return 0; 
    } 

    return ($a < $b) ? -1 : 1; 
} 


$tracks = array(); 

while ($row = $result->fetch_assoc()) { 
    $tracks[] = $row; 
} 

usort($tracks, 'normalize'); 

प्रश्न 2: क्या यह कस्टम सॉर्टिंग प्राप्त करने का सबसे अच्छा तरीका है?

प्रश्न 3::

यहाँ जहां मैं एक दीवार से टकराने हूँ मैं पता नहीं कैसे मेरी जरूरतों के हिसाब से नामों को सॉर्ट करने सामान्य समारोह बनाना होगा। मैं कुछ पात्रों (¡,?, ',!, ¿) को कैसे अनदेखा करूं और मैं अन्य पात्रों को प्राकृतिक समकक्ष (Á -> ए, ए -> ई, आदि ..) के साथ कैसे बदलूं मेरा मानना ​​है कि कुछ अनदेखा करके पात्रों और दूसरों की जगह, मैं सॉर्टिंग प्राप्त कर सकता हूं जिसके लिए मैं loojing कर रहा हूँ ...

प्रश्न 4: यह सब समझ में आता है? क्या मैं सही रास्ते पर हूं?

आपकी सभी सलाह के लिए अग्रिम धन्यवाद। मार्को

उत्तर

1

आप add your own collation MySQL पर कर सकते हैं। फिर आप उन पात्रों को अनदेखा कर सकते हैं जिनके बारे में आप परवाह नहीं करते हैं, आवश्यकतानुसार उच्चारण को पट्टी करते हैं, और आमतौर पर चीजों को किसी भी तरह से क्रमबद्ध करते हैं।

क्लाइंट पक्ष पर उलझन-संयोजन (यानी डेटाबेस में बजाए PHP में) करना डेटाबेस में ऐसा करने जितना तेज़ नहीं होगा। जैसे ही आपको अपनी क्वेरी में LIMIT और OFFSET क्लॉज जोड़ना होगा, यह दृष्टिकोण भी दुर्भाग्य से विफल हो जाएगा। मुझे यकीन नहीं है कि कस्टम कॉलेशन MAX() समान कार्यों के लिए सही चीज करते हैं लेकिन PHP में उलझन-संयोजन करना निश्चित रूप से तब तक नहीं होगा जब तक आप पूरी तालिका को खींचना नहीं चाहते हैं, इसे सॉर्ट करें और फिर केवल एक प्रविष्टि लें।

तो, मैं अंतिम उपाय के रूप में डेटाबेस के बाहर संयोजन को करने पर विचार करता हूं।

एक और विकल्प, यदि आप अपना खुद का संयोजन नहीं बनाना चाहते हैं, तो अपनी तालिका में एक कृत्रिम कॉलम बनाना है जो ठीक से सॉर्ट करता है। आप PHP-land में normalize() फ़ंक्शन का उपयोग कर सकते हैं (जैकब की तरह कुछ उचित प्रारंभ बिंदु होगा) और परिणाम को डेटाबेस में रखें, कहें, sortable_title; तो ORDER BY sortable_title चाल करेगा।

  • 123 pasitos
  • अफ्रीका
  • Alhambra
  • arroz: आप एक normalize() पीएचपी समारोह है कि (सभी लोअर केस कोई विराम चिह्न,, लहजे छीन, ...) एक इस तरह सूची का उत्पादन किया चाहते हैं
  • decirevilla
  • decir

तो है कि एक साधारण रूप में सीआईआई-सटिकल सॉर्ट द राइट थिंग करेगा। बेशक, आपको INSERT करते समय sortable_title प्रारंभ करना होगा और UPDATE के दौरान इसे पुन: उत्पन्न करना होगा, लेकिन यदि आपका कोड ठीक से encapsulated है तो यह काफी सीधे आगे होना चाहिए।

प्रश्न 4: मुझे लगता है कि मैं याकूब से असहमत होने जा रहा हूं और कहता हूं कि आप डेटाबेस से बाहर निकलने के द्वारा सही दिशा में नहीं जा रहे हैं। मैं यह नहीं कह रहा हूं कि आप पूरी तरह से ट्रैक से बाहर हैं लेकिन आप माइस्क्लुएल को सॉर्टिंग को संभालने से बेहतर हैं, भले ही आप ऊपर उल्लिखित sortable_title हैक जैसी कुछ मदद के साथ कुछ मदद दे सकें।

+0

क्या मैं एक साझा मेजबान पर हूं, तो मैं अपना स्वयं का संयोजन MySQL में जोड़ सकता हूं? – Marco

+0

@ मार्को: यह होस्टिंग प्रदाता पर निर्भर करता है लेकिन मैं शायद "शायद नहीं" की तरफ झुकता हूं। यदि आप नहीं कर सकते हैं तो 'sortable_title' दृष्टिकोण लगभग नौकरी भी मिल जाएगी। –

+1

मैंने प्रोग्रामिंग को दोनों विधियों को समाप्त कर दिया है और sortable_title के साथ एक बहुत अधिक, तेज़ है। मैंने mysql समाधान के लिए एक टाइमर और औसत परिणाम जोड़े हैं: 0.00 9 सेकंड ... PHP समाधान: 0.12 सेकंड। अजीब चीज यह है कि मैंने सूची को कैश किया है (ob_start() .. विधि का उपयोग करके) और कैशिंग ध्यान देने योग्य धीमी है ... मुझे लगता है कि, इस विशिष्ट मामले में, कैश की गई फ़ाइल खोलने से धीमी गति होती है और फिर क्वेरी निष्पादित होती है। ..आपको आश्चर्य होता है कि PHP में कैशिंग हमेशा आवश्यक नहीं है ... – Marco

0

प्रश्न 2. कस्टम सॉर्टिंग प्राप्त करने का यह एक अच्छा तरीका है, तो आपको केवल एक ही वास्तविक काम करना है जो तुलनात्मक कार्य पर है।

प्रश्न 3. स्ट्रिंग को एएससीआईआई समकक्ष में iconv का उपयोग करके परिवर्तित करने के लायक हो सकता है। जो यूटीएफ -8 को एएससीआईआई में परिवर्तित कर सकता है और अनुवाद का उपयोग कर सकता है, यह चरित्र से मेल खाता है जिसे सीधे ऐसा कुछ नहीं बदला जा सकता है।

यानी।ए -> ए, ए -> ई, आदि ..

एक बार इसके रूपांतरित होने के बाद आप उन पात्रों को हटा सकते हैं जिन्हें आप preg_replace या str_replace का उपयोग करके सॉर्ट करना नहीं चाहते हैं।

यहां एक तुलनात्मक फ़ंक्शन का उदाहरण दिया गया है जिसका आप उपयोग कर सकते हैं।

function normalize_string($string) { 
    $ascii = iconv("utf-8","ascii//TRANSLIT", $string); 
    return str_replace(array('!', "'", '?'), '', $ascii); 

    // or 

    return preg_replace('/[!\'?]/', '', $ascii); 

    // or depending on how much you do want to replace... \W => any "non-word" character 

    return preg_replace('/\W/', '', $ascii); 
} 

function custom_str_cmp($a, $b) { 
    return strcmp(normalize_string($a), normalize_string($b)); 
} 

usort($tracks, 'custom_str_cmp'); 

प्रश्न 4. हां।

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