Próbowałem rozwiązać problem według sugestii RandomSeed „Języki PEŁNOTEKSTOWE i azjatyckie z MySQL 5.0”. Problem polega jednak na tym, że nie można przeprowadzić wyszukiwania dwuznakowego, chyba że ustawisz „ft_min_word_len” na 2. Ponownie, usługa hostingowa za 1 USD na miesiąc nie pozwala na to.
Dobrze, spędziłem 1 noc, aby wypracować rozwiązanie obejściowe. Koncepcja polega na konwersji wszystkich niealfabetowych znaków ciągu UTF-8 na kilka unikalnych kodów.
Oto magiczna funkcja. Zapożyczono z forum CSDN i wprowadzono pewne zmiany.
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;
}
Wynik
echo UTF2UCS("測試haha")
będzie „6e2c 8a66 haha”
Załóżmy, że masz pole o nazwie „nazwa_piosenki”. Wystarczy przekonwertować wszystkie nazwy utworów za pomocą funkcji UTF2UCS, a następnie zapisać te zaszyfrowane ciągi w polu indeksu pełnotekstowego, np. „song_name_ucs”.
Gdy następnym razem będziesz czegoś szukać, wystarczy:
$temp_string = UTF2UCS('測試', true);
SELECT * FROM song WHERE MATCH (song_name_ucs) AGAINST ('$temp_string')
Pamiętaj, aby umieścić prawdę w drugim parametrze UTF2UCS, gdy chcesz, aby w wynikach wyszukiwania pojawiły się zarówno „測”, jak i „試”.
To może nie jest najlepsze rozwiązanie, ale nie wymaga żadnej wtyczki ani zmian w systemie. Czysty kod PHP.