Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como realizar a pesquisa de texto completo do Mysql com caracteres chineses?


Tentei resolver o problema pela sugestão do RandomSeed "FULLTEXT and Asian Languages ​​with MySQL 5.0". Mas o problema é que você não pode realizar uma pesquisa de 2 caracteres a menos que você defina "ft_min_word_len" para 2. Novamente, o serviço de hospedagem na web de $ 1/mês não permite que você faça isso.

Tudo bem, passei 1 noite para encontrar uma solução alternativa. O conceito é converter todos os caracteres não alfabéticos de uma string UTF-8 em alguns códigos exclusivos.

Aqui está a função mágica. Emprestado do fórum CSDN e fiz algumas alterações.
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;
}

O resultado de
echo UTF2UCS("測試haha")

será "6e2c 8a66 haha"

Digamos que você tenha um campo chamado "song_name". Você só precisa converter todos os nomes de músicas pela função UTF2UCS e salvar essas strings criptografadas em um campo de índice de texto completo, por exemplo, "song_name_ucs".

Da próxima vez que você precisar pesquisar algo, tudo o que você precisa fazer é:
$temp_string = UTF2UCS('測試', true);
SELECT * FROM song WHERE MATCH (song_name_ucs) AGAINST ('$temp_string') 

Lembre-se de colocar um true no segundo parâmetro do UTF2UCS quando você precisar que '測' e '試' apareçam no resultado da pesquisa.

Esta pode não ser a melhor solução, mas não requer nenhum plugin ou alterações no sistema. Código PHP puro.