Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中将php变量“foobar”与“foobar”匹配_Php_Mysql_Regex - Fatal编程技术网

在mysql中将php变量“foobar”与“foobar”匹配

在mysql中将php变量“foobar”与“foobar”匹配,php,mysql,regex,Php,Mysql,Regex,我的mysql表包含一个条目 Foo Bar i、 e可能包括大写字母和空格 我需要使用字符串“foobar”搜索数据库并匹配此 foobar最初是通过以下方式从DB生成的: 在执行比较之前,在MySQL中将foobar转换为foobar并不容易。那么你只需要做: WHERE LOWER(preg_replace('/[^A-Za-z0-9]/', '', field)) = 'foobar' 最简单的选项是使用,默认情况下不区分大小写,只需在PHP内foobar中的每个字符之间插入[^[

我的mysql表包含一个条目

Foo Bar 
i、 e可能包括大写字母和空格

我需要使用字符串“foobar”搜索数据库并匹配此

foobar最初是通过以下方式从DB生成的:

在执行比较之前,在MySQL中将foobar转换为foobar并不容易。那么你只需要做:

WHERE LOWER(preg_replace('/[^A-Za-z0-9]/', '', field)) = 'foobar'
最简单的选项是使用,默认情况下不区分大小写,只需在PHP内foobar中的每个字符之间插入[^[:alnum:]]*,然后搜索数据库:

WHERE field RLIKE '^[^[:alnum:]]*f[^[:alnum:]]*o[^[:alnum:]]*o[^[:alnum:]]*b[^[:alnum:]]*a[^[:alnum:]]*r[^[:alnum:]]*$'
我认为最优雅但有点困难的解决方案是忽略非字母数字字符和字母大小写,然后使用它们。

在执行比较之前,在MySQL中将foobar转换为foobar并不容易。那么你只需要做:

WHERE LOWER(preg_replace('/[^A-Za-z0-9]/', '', field)) = 'foobar'
最简单的选项是使用,默认情况下不区分大小写,只需在PHP内foobar中的每个字符之间插入[^[:alnum:]]*,然后搜索数据库:

WHERE field RLIKE '^[^[:alnum:]]*f[^[:alnum:]]*o[^[:alnum:]]*o[^[:alnum:]]*b[^[:alnum:]]*a[^[:alnum:]]*r[^[:alnum:]]*$'

我认为最优雅但有些困难的解决方案是忽略非字母数字字符和字母大小写,然后使用它。

MySQL没有任何与gawk的gensub或PHP的preg_替换相当的东西。虽然可以使用MySQL的和函数删除特定字符,但不能告诉MySQL删除/[^[:alnum:][]/


我的建议是使用。

MySQL没有任何与gawk的gensub或PHP的preg_替换相当的东西。虽然可以使用MySQL的和函数删除特定字符,但不能告诉MySQL删除/[^[:alnum:][]/


如果只有空格是问题所在,并且排序规则不区分大小写,我建议使用。

WHERE REPLACE(tn.fieldname,' ','') LIKE 'foobar';
WHERE LOWER(REPLACE(tn.fieldname,' ','')) LIKE LOWER('foobar');
如果排序规则区分大小写:

WHERE REPLACE(tn.fieldname,' ','') LIKE 'foobar';
WHERE LOWER(REPLACE(tn.fieldname,' ','')) LIKE LOWER('foobar');

但是,这将导致全表扫描,因此性能不佳。将字段名规范化为您正在搜索的内容,或使用规范化字段名的另一列将执行得更好,尤其是在其上有索引的情况下。

如果只有空格是问题所在,并且排序规则不区分大小写:

WHERE REPLACE(tn.fieldname,' ','') LIKE 'foobar';
WHERE LOWER(REPLACE(tn.fieldname,' ','')) LIKE LOWER('foobar');
如果排序规则区分大小写:

WHERE REPLACE(tn.fieldname,' ','') LIKE 'foobar';
WHERE LOWER(REPLACE(tn.fieldname,' ','')) LIKE LOWER('foobar');

但是,这将导致全表扫描,因此性能不佳。将fieldname规范化为您正在搜索的内容,或使用规范化fieldname的另一列将执行得更好,尤其是在其上有索引的情况下。

如果在单词之间没有任何分隔符,您将遇到很大的麻烦。我认为,你必须改变逻辑,改变“foobar”的生成方式。我曾经玩弄过获取所有数据库数据的想法,使用stru替换转换字段。。。方法并将其与“foobar”匹配,同时提取行ID-然后我将获取与行ID匹配的“foobar”。这将是主要工作,但看起来很混乱。如果单词之间没有任何分隔符,您将遇到很大的麻烦。我认为,你必须改变逻辑,改变“foobar”的生成方式。我曾经玩弄过获取所有数据库数据的想法,使用stru替换转换字段。。。方法并将其与“foobar”匹配,同时提取行ID-然后我将获取与行ID匹配的“foobar”。这将是主要工作,但看起来很混乱。OP还说了特殊字符。。。在这种情况下,答案的第二部分就生效了。我喜欢这个——做我需要的事情。我曾经使用过:我愚蠢地将现在从我的问题中删除的特殊字符的需要包括在内,我不需要这些字符,因为字符串构成了我URL的一部分。我用了很多词:WHERE LOWERREPLACEtn.fieldname,,='foobar'-不确定我为什么需要小写的'foobar'?不需要,如果你知道它将是小写的。另外,请记住:选择_utf8'a'校对'utf8\u-bin'=\u utf8'a'校对'utf8\u-bin';为false,但选择_utf8'a'校对'utf8'u常规\u ci'=\u utf8'a'校对'utf8'u常规\u ci';是真的,所以根据排序规则,你甚至不需要第一个。OP也说了特殊字符。。。在这种情况下,答案的第二部分就生效了。我喜欢这个——做我需要的事情。我曾经使用过:我愚蠢地将现在从我的问题中删除的特殊字符的需要包括在内,我不需要这些字符,因为字符串构成了我URL的一部分。我用了很多词:WHERE LOWERREPLACEtn.fieldname,,='foobar'-不确定我为什么需要小写的'foobar'?不需要,如果你知道它将是小写的。另外,请记住:选择_utf8'a'校对'utf8\u-bin'=\u utf8'a'校对'utf8\u-bin';为false,但选择_utf8'a'校对'utf8'u常规\u ci'=\u utf8'a'校对'utf8'u常规\u ci';是真的,所以根据排序规则,您甚至不需要第一个。感谢您的详细回复和链接。UDF是有点超出我的能力,我不需要的能力为规格字符毕竟。感谢详细的答复和链接。UDF有点超出我的能力,毕竟我不需要特殊角色的能力。