sql >> Databasteknik >  >> RDS >> Mysql

Hur utför man Mysql-fulltextsökning med kinesiska tecken?

Försökte lösa problemet med RandomSeeds förslag "FULLTEXT and Asian Languages ​​with MySQL 5.0". Men problemet är att du inte kan utföra en sökning med två tecken om du inte ställer in "ft_min_word_len" till 2. Återigen, 1 $/månad webbhotell tillåter dig inte att göra det.

Okej, tillbringade en natt för att komma fram till en lösning. Konceptet är att konvertera alla tecken som inte är alfabetiska i en UTF-8-sträng till några unika koder.

Här är den magiska funktionen. Lånade från CSDN-forumet och gjorde några ändringar.

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 av

echo UTF2UCS("測試haha")

kommer att vara "6e2c 8a66 haha"

Säg att du har ett fält som heter "låtnamn". Du behöver bara konvertera alla låtnamn med UTF2UCS-funktionen och sedan spara de krypterade strängarna i ett fulltextindexfält, t.ex. "låt_namn_ucs".

Nästa gång du behöver söka efter något är allt du behöver göra:

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

Kom ihåg att sätta ett sant i UTF2UCS andra parameter när du behöver både '測' och '試' visas i sökresultatet.

Detta kanske inte är den bästa lösningen, men det kräver inga plugin-program eller ändringar i systemet. Ren PHP-kod.



  1. Hur man effektivt konverterar long int till dotted quad IP i bash

  2. SQL Server - definierar en XML-typkolumn med UTF-8-kodning

  3. MySQL - Värdet på 1 i DECIMAL(2, 2) kommer ut som 0,99

  4. Hur man sammanfogar flera värden från flera relationstabeller i en enda mysql-fråga