Đã cố gắng giải quyết vấn đề theo gợi ý của RandomSeed "FULLTEXT và Asian Languages with MySQL 5.0". Nhưng vấn đề là bạn không thể thực hiện tìm kiếm 2 ký tự trừ khi bạn đặt "ft_min_word_len" thành 2. Một lần nữa, dịch vụ lưu trữ web $ 1 / tháng không cho phép bạn làm điều đó.
Được rồi, đã dành 1 đêm để tìm ra giải pháp khắc phục. Khái niệm này là chuyển đổi tất cả các ký tự không phải bảng chữ cái của một chuỗi UTF-8 thành một số mã duy nhất.
Đây là chức năng kỳ diệu. Mượn từ diễn đàn CSDN và thực hiện một số thay đổi.
Hàmfunction 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;
}
Kết quả của
echo UTF2UCS("測試haha")
sẽ là "6e2c 8a66 haha"
Giả sử bạn có một trường tên là "song_name". Bạn chỉ cần chuyển đổi tất cả các tên bài hát bằng hàm UTF2UCS, sau đó lưu các chuỗi mã hóa đó vào trường chỉ mục đầy đủ, ví dụ:"song_name_ucs".
Lần tới khi bạn cần tìm kiếm thứ gì đó, tất cả những gì bạn cần làm là:
$temp_string = UTF2UCS('測試', true);
SELECT * FROM song WHERE MATCH (song_name_ucs) AGAINST ('$temp_string')
Hãy nhớ đặt true trong tham số thứ hai của UTF2UCS khi bạn cần cả '測' và '試' xuất hiện trong kết quả tìm kiếm.
Đây có thể không phải là giải pháp tốt nhất, nhưng nó không yêu cầu bất kỳ plugin hoặc thay đổi nào đối với hệ thống. Mã PHP thuần túy.