sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo realizar la búsqueda de texto completo de Mysql con caracteres chinos?

Intenté resolver el problema con la sugerencia de RandomSeed "FULLTEXT and Asian Languages ​​with MySQL 5.0". Pero el problema es que no puede realizar una búsqueda de 2 caracteres a menos que establezca "ft_min_word_len" en 2. Una vez más, el servicio de alojamiento web de $1/mes no le permite hacer eso.

Muy bien, pasé 1 noche para encontrar una solución alternativa. El concepto es convertir todos los caracteres no alfabéticos de una cadena UTF-8 en algunos códigos únicos.

Aquí está la función mágica. Tomado del foro de CSDN y realizado algunos cambios.

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

El resultado de

echo UTF2UCS("測試haha")

será "6e2c 8a66 jaja"

Digamos que tiene un campo llamado "song_name". Solo necesita convertir todos los nombres de las canciones mediante la función UTF2UCS, luego guardar esas cadenas cifradas en un campo de índice de texto completo, por ejemplo, "nombre_canción_ucs".

La próxima vez que necesite buscar algo, todo lo que necesita hacer es:

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

Recuerde poner un verdadero en el segundo parámetro de UTF2UCS cuando necesite que aparezcan tanto '測' como '試' en el resultado de la búsqueda.

Puede que esta no sea la mejor solución, pero no requiere ningún complemento ni cambios en el sistema. Código PHP puro.