Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie führt man eine Mysql-Volltextsuche mit chinesischen Schriftzeichen durch?

Versucht, das Problem durch den Vorschlag von RandomSeed "FULLTEXT and Asian Languages ​​with MySQL 5.0" zu lösen. Das Problem ist jedoch, dass Sie keine Suche mit 2 Zeichen durchführen können, es sei denn, Sie setzen "ft_min_word_len" auf 2. Auch hier erlaubt Ihnen der Webhosting-Service für 1 $/Monat dies nicht.

Okay, verbrachte 1 Nacht damit, eine Workaround-Lösung auszuarbeiten. Das Konzept besteht darin, alle Nicht-Alphabet-Zeichen einer UTF-8-Zeichenfolge in eindeutige Codes umzuwandeln.

Hier ist die magische Funktion. Vom CSDN-Forum ausgeliehen und einige Änderungen vorgenommen.

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;
}

Das Ergebnis von

echo UTF2UCS("測試haha")

wird "6e2c 8a66 haha" sein

Angenommen, Sie haben ein Feld namens "song_name". Sie müssen nur alle Songnamen mit der UTF2UCS-Funktion konvertieren und diese verschlüsselten Zeichenfolgen dann in einem Volltext-Indexfeld speichern, z. B. "song_name_ucs".

Wenn Sie das nächste Mal etwas suchen müssen, brauchen Sie nur Folgendes zu tun:

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

Denken Sie daran, im zweiten Parameter von UTF2UCS ein true einzugeben, wenn sowohl „測“ als auch „試“ im Suchergebnis erscheinen sollen.

Dies ist möglicherweise nicht die beste Lösung, erfordert jedoch kein Plugin oder Änderungen am System. Reiner PHP-Code.