sql >> Databáze >  >> RDS >> Mysql

Jak provádět fulltextové vyhledávání Mysql s čínskými znaky?

Pokusil se vyřešit problém pomocí návrhu RandomSeed "FULLTEXT a asijské jazyky s MySQL 5.0". Problém je ale v tom, že nemůžete provádět vyhledávání o 2 znacích, pokud nenastavíte "ft_min_word_len" na 2. Opět platí, že webhostingové služby ve výši 1 $ měsíčně vám to neumožňují.

Dobře, strávili jsme 1 noc, abychom našli řešení, jak to obejít. Koncept je převést všechny neabecední znaky řetězce UTF-8 na nějaké jedinečné kódy.

Zde je magická funkce. Půjčeno z fóra CSDN a provedeno několik změn.

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

Výsledek

echo UTF2UCS("測試haha")

bude "6e2c 8a66 haha"

Řekněme, že máte pole s názvem „název_skladby“. Stačí převést všechny názvy skladeb pomocí funkce UTF2UCS a poté uložit tyto zašifrované řetězce do fulltextového indexového pole, např. "song_name_ucs".

Až budete příště něco hledat, stačí:

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

Nezapomeňte do druhého parametru UTF2UCS vložit hodnotu true, pokud potřebujete, aby se ve výsledku vyhledávání objevilo '測' i '試'.

To nemusí být nejlepší řešení, ale nevyžaduje žádný plugin ani změny systému. Čistý kód PHP.



  1. 2 způsoby, jak přidat znak procenta k číslu v SQLite

  2. Jak mohu vytvořit dvě podmínky v klauzuli

  3. Jak mohu optimalizovat databázi pro superstring dotazy?

  4. DELETE FROM HAVING COUNT(*) v MySQL