请教!关于PHP对一个数组内的中文字符进行模糊匹配问题!

时间:2021-12-18 07:39:31
我想写一个模糊搜索,但是MYSQL数据库中的中文内容在入库的时候被urlencode了,无法直接用SQL语句来进行模糊查询,我把数据全部读取出来并进行urldecode,想对该数组进行中文的模糊匹配,但是没有一个比较好的思路。希望各位高手能给小弟一些好的建议!谢谢~!

我的数组结构是:
----------------------------------------------
array{
  [0]{
      [name] => 我是PHP
  }
  [1]{
      [name] => 我是大大MYSQL
  }
  [2]{
      [name] => mysql
  }
  [...]{
      [name] => ...
  }
}

假设我的数据有1W条的话,如何来做效率比较高一些呢?

10 个解决方案

#1


遍历数组,在正则匹配前进行strpos查找%确定有urlencode的字符后才进行decode并做中文匹配。
更进一步的话,可以自行计算%后面的字符序列是否为普通ASCII字符。

不过我觉得你可以从更根源的地方开始考虑这个问题,一开始选取数据的时候,就用:

SELECT name FROM tbl_name WHERE name regexp '%[a-zA-Z0-9]{2}'

这样的话读到内存中的数据量会少一些,可以前面查找%的步骤,性能方面应该也会更好一些。

#2


我试着把关键字先urlencode后再放到SQL语句里面查询,貌似没有效果~!

#3


想到一个好的方法了,呵呵!
使用文件缓存的思路,先将所有数据读出,进行字符匹配,完成后把数据存入到文本中。设置一个数据更新的时间段,每次有提交查询的时候先检查数据缓存文件是否存在,时间是否在设置的时间段内,如果满足条件则直接拿关键子文本数据里的数据进行匹配,否则从新重数据库中重新获取数据。效率相对要比每次去读完数据库数据完成要高!

各位PHP大哥们可否帮小弟看看这方法可行否?

#4


哎~!咋都没人呢~?再来一个兄弟我就结帖了~!

#5


引用 2 楼 Sky333 的回复:
我试着把关键字先urlencode后再放到SQL语句里面查询,貌似没有效果~! 


你的查询语句? 如果有精确的关键字,其urlencode的结果是确定的,肯定可以用于查询。

#6


该回复于2009-07-06 13:15:20被版主删除

#7


有很多需要考虑的地方,你的编码是什么?你要查询的是中文还是什么?

效率最高的是使用sql语句中就查询完成

#8


我的SQL 语句是

$str = urlencode("小猪");

"select * from table where key link {$str}"

#9


SELECT name FROM tbl_name WHERE name regexp '%[a-zA-Z0-9]{2}'

#10


还是SQL效率高呗,什么文件缓存我看还是不怎么行。I/O 数据库会快点。

#1


遍历数组,在正则匹配前进行strpos查找%确定有urlencode的字符后才进行decode并做中文匹配。
更进一步的话,可以自行计算%后面的字符序列是否为普通ASCII字符。

不过我觉得你可以从更根源的地方开始考虑这个问题,一开始选取数据的时候,就用:

SELECT name FROM tbl_name WHERE name regexp '%[a-zA-Z0-9]{2}'

这样的话读到内存中的数据量会少一些,可以前面查找%的步骤,性能方面应该也会更好一些。

#2


我试着把关键字先urlencode后再放到SQL语句里面查询,貌似没有效果~!

#3


想到一个好的方法了,呵呵!
使用文件缓存的思路,先将所有数据读出,进行字符匹配,完成后把数据存入到文本中。设置一个数据更新的时间段,每次有提交查询的时候先检查数据缓存文件是否存在,时间是否在设置的时间段内,如果满足条件则直接拿关键子文本数据里的数据进行匹配,否则从新重数据库中重新获取数据。效率相对要比每次去读完数据库数据完成要高!

各位PHP大哥们可否帮小弟看看这方法可行否?

#4


哎~!咋都没人呢~?再来一个兄弟我就结帖了~!

#5


引用 2 楼 Sky333 的回复:
我试着把关键字先urlencode后再放到SQL语句里面查询,貌似没有效果~! 


你的查询语句? 如果有精确的关键字,其urlencode的结果是确定的,肯定可以用于查询。

#6


该回复于2009-07-06 13:15:20被版主删除

#7


有很多需要考虑的地方,你的编码是什么?你要查询的是中文还是什么?

效率最高的是使用sql语句中就查询完成

#8


我的SQL 语句是

$str = urlencode("小猪");

"select * from table where key link {$str}"

#9


SELECT name FROM tbl_name WHERE name regexp '%[a-zA-Z0-9]{2}'

#10


还是SQL效率高呗,什么文件缓存我看还是不怎么行。I/O 数据库会快点。