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

Hvordan udfører man Mysql fuldtekstsøgning med kinesiske tegn?

Forsøgte at løse problemet ved RandomSeeds forslag "FULLTEXT and Asian Languages ​​with MySQL 5.0". Men problemet er, at du ikke kan udføre en søgning på 2 tegn, medmindre du indstiller "ft_min_word_len" til 2. Igen, $1/måneds webhostingtjeneste tillader dig ikke at gøre det.

Okay, brugte 1 nat på at finde en løsning. Konceptet er at konvertere alle ikke-alfabettegn i en UTF-8-streng til nogle unikke koder.

Her er den magiske funktion. Lånte fra CSDN-forum og lavede nogle ændringer.

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

Resultatet af

echo UTF2UCS("測試haha")

vil være "6e2c 8a66 haha"

Lad os sige, at du har et felt, der hedder "sang_navn". Du skal bare konvertere alle sangnavne ved hjælp af UTF2UCS-funktionen, og derefter gemme de krypterede strenge i et fuldtekstindeksfelt, f.eks. "sang_navn_ucs".

Næste gang du skal søge efter noget, skal du blot:

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

Husk at sætte en sand i UTF2UCS's anden parameter, når du skal have både '測' og '試' vises i søgeresultatet.

Dette er måske ikke den bedste løsning, men det kræver ikke noget plugin eller ændringer i systemet. Ren PHP-kode.



  1. listunagg funktion?

  2. Slet forespørgsel For at slette rækker i MySQL

  3. Sådan fungerer Date()-funktionen i SQLite

  4. SCD Type 4