Php 没有任何特殊字符的MySQL搜索

Php 没有任何特殊字符的MySQL搜索,php,mysql,Php,Mysql,我想知道是否可以搜索MySQL字段,该字段可能有以下内容: test - hello SELECT ... FROM MyTable WHERE SOUNDEX(somefield) = SOUNDEX('test: hello'); 但是您有一个来自用户的字符串 test: hello 显然,在PHP端很容易去除字符串中的任何特殊字符,但是否可以搜索MySQL行并忽略特殊字符?如果您从用户输入列中找到并替换所有此类特殊字符和空格,这是可能的, i、 e 通过使用SOUNDEX()函数,可

我想知道是否可以搜索MySQL字段,该字段可能有以下内容:

test - hello
SELECT ...
FROM MyTable
WHERE SOUNDEX(somefield) = SOUNDEX('test: hello');
但是您有一个来自用户的字符串

test: hello

显然,在PHP端很容易去除字符串中的任何特殊字符,但是否可以搜索MySQL行并忽略特殊字符?

如果您从用户输入列中找到并替换所有此类特殊字符和空格,这是可能的, i、 e

通过使用
SOUNDEX()
函数,可以对特殊字符、空格等进行“忽略”排序:

mysql> select soundex('test - hello'), soundex('test: hello');
+-------------------------+------------------------+
| soundex('test - hello') | soundex('test: hello') |
+-------------------------+------------------------+
| T234                    | T234                   |
+-------------------------+------------------------+
因此,您可以按如下方式搜索数据:

test - hello
SELECT ...
FROM MyTable
WHERE SOUNDEX(somefield) = SOUNDEX('test: hello');

这将是不可索引的,所以它将被迫做一个表扫描。如果使用MySQL 5.7,可以为soundex表达式添加一个虚拟列,并为该虚拟列编制索引。这将大大提高性能。

另一个独特的解决方案是在每个单词之间添加通配符。只要搜索短语中没有特殊字符,就会返回正确的结果,同时忽略结果中的任何特殊字符

例如

SELECT *
FROM myTable
WHERE somefield LIKE '%test%hello%'

基本上使用全文索引。否则,不,您不能“忽略”字符。这是你的代码必须做的事情,而不是mysql。嗯,这是一种非常新颖的方法,可能会尝试一下,谢谢!不了解SOUNDEX的人,要当心@BillKarwin请在答案顶部添加一条警告,说明不同的拼写也可以有相同的soundex代码。例如,尝试
选择SOUNDEX('hello-world')、SOUNDEX('helo-world')、SOUNDEX('helllo:world')、SOUNDEX('hello:world')
。顺便说一句,出于同样的原因,你的答案通常是错误的(但可能适用于OP);它可能会返回听起来类似的错误记录是的,当然在使用它之前应该知道该函数是如何工作的。OP要求进行某种类型的不精确匹配。