Mysql
 sql >> Database >  >> RDS >> Mysql

Come eseguire la ricerca fulltext su Mysql con caratteri cinesi?

Ho provato a risolvere il problema con il suggerimento di RandomSeed "FULLTEXT e lingue asiatiche con MySQL 5.0". Ma il problema è che non puoi eseguire una ricerca di 2 caratteri a meno che non imposti "ft_min_word_len" su 2. Ancora una volta, il servizio di web hosting da $ 1/mese non ti consente di farlo.

Va bene, ho passato 1 notte a trovare una soluzione alternativa. Il concetto è convertire tutti i caratteri non alfabetici di una stringa UTF-8 in alcuni codici univoci.

Ecco la funzione magica. Preso in prestito dal forum CSDN e apportato alcune modifiche.

function UTF2UCS($str, $s) {
    $str = strtolower($str);
    $char = 'UTF-8';
    $arr = array();
    $out = "";
    $c = mb_strlen($str,$char);
    $t = false;

    for($i =0;$i<$c;$i++){
        $arr[]=mb_substr($str,$i,1,$char);
    }

    foreach($arr as $i=>$v){
        if(preg_match('/\w/i',$v,$match)){
            $out .= $v;
            $t = true;
        }else{
            if($t) $out .= " ";
            if(isset($s) && $s) $out .= "+";
            $out .= bin2hex(iconv("UTF-8","UCS-2",$v))." ";
            $t = false;
        }
    }
    return $out;
}

Il risultato di

echo UTF2UCS("測試haha")

sarà "6e2c 8a66 haha"

Supponiamo di avere un campo chiamato "song_name". Devi solo convertire tutti i nomi dei brani tramite la funzione UTF2UCS, quindi salvare quelle stringhe crittografate in un campo di indice fulltext, ad esempio."song_name_ucs".

La prossima volta che devi cercare qualcosa, tutto ciò che devi fare è:

$temp_string = UTF2UCS('測試', true);
SELECT * FROM song WHERE MATCH (song_name_ucs) AGAINST ('$temp_string') 

Ricordarsi di inserire true nel secondo parametro di UTF2UCS quando è necessario che nel risultato della ricerca vengano visualizzati sia '測' che '試'.

Questa potrebbe non essere la soluzione migliore, ma non richiede alcun plug-in o modifiche al sistema. Puro codice PHP.