Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm thế nào để thực hiện tìm kiếm toàn văn bản Mysql với các ký tự Trung Quốc?

Đã 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àm
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;
}

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tôi có thể sử dụng cột mà tôi đã chọn sau này trong một truy vấn không?

  2. java.lang.Incomp Tương thíchClassChangeError:Đã tìm thấy lớp com.mysql.jdbc.Statement, nhưng giao diện được mong đợi

  3. If else trên mệnh đề WHERE

  4. Kết nối với MySQL trên AWS từ máy cục bộ

  5. mysqlworkbench đưa ra lỗi phiên bản khi xuất cơ sở dữ liệu