Php MySQL Regexp where like值

Php MySQL Regexp where like值,php,mysql,sql,regex,Php,Mysql,Sql,Regex,我正在尝试将一个纯粹是数字的数值与数据库中的另一个值进行匹配,该值是相同的数字,但有符号等(它是电话号码) 如何让MySQL只将mainNumber列(其中包含符号等)的regexp与我的值(仅数字)匹配 下面是我的代码: $SQL = "SELECT entities.name FROM entities_main_numbers LEFT JOIN entities ON entities.id = entities_main_numbers.entit

我正在尝试将一个纯粹是数字的数值与数据库中的另一个值进行匹配,该值是相同的数字,但有符号等(它是电话号码)

如何让MySQL只将mainNumber列(其中包含符号等)的regexp与我的值(仅数字)匹配

下面是我的代码:

$SQL = "SELECT entities.name
        FROM entities_main_numbers
           LEFT JOIN entities ON entities.id = entities_main_numbers.entityId
        WHERE mainNumber = ?
        LIMIT 1";


例如+44(0)800 123 123与440800123123的匹配在去掉空格后,您可以创造性地匹配右边的9位数字,但如果需要完整数字,您可以对
REPLACE
进行一些递归调用,以消除
()和+

mainnumber = RIGHT(REPLACE('+44 (0)800 123 123', ' ', ''), 9);

在去掉空格后,您可以很有创意地从右边匹配9位数字,但如果需要完整的数字,您可以对
REPLACE
进行一些递归调用,以消除
()和+

mainnumber = RIGHT(REPLACE('+44 (0)800 123 123', ' ', ''), 9);

MYSQL解决方案

您可以使用多个replace语句

 WHERE REPLACE(REPLACE(REPLACE(REPLACE(mainNumber, '+', ''), ')', ''), '(', ''), ' ', '') = $targetNum
很难看,但它的工作。用
'

这将把这个号码
+44(0)800 123
转换成这个号码
440800123123
如果
$targetNum=440800123123

或PHP解决方案

PHP

SQL


可能是更好的解决方案,因为它对数据库的负担更小

MYSQL解决方案

您可以使用多个replace语句

 WHERE REPLACE(REPLACE(REPLACE(REPLACE(mainNumber, '+', ''), ')', ''), '(', ''), ' ', '') = $targetNum
很难看,但它的工作。用
'

这将把这个号码
+44(0)800 123
转换成这个号码
440800123123
如果
$targetNum=440800123123

或PHP解决方案

PHP

SQL


可能是一个更好的解决方案,因为它对数据库的负担更小,但如果您只想使用内置函数,可以使用一系列
REPLACE
来过滤掉任何您不想要的字符。
例如:


非常难看,但是如果您只想使用内置函数,您可以使用一系列
REPLACE
来过滤掉任何您不想要的字符。
例如:


我不是MySQL专家,但您可能会创建一个接受数值的函数。e、 并将其转换为类似正则表达式的

'\D*4\D*4\D*0\D*8\D*0\D*0\D*1\D*2\D*3\D*1\D*2\D*3\D*'
\D
[^0-9]
,以防MySQL中未定义)


这可以与普通的REGEXP命令一起使用…

我不是MySQL专家,但是您可以创建一个接受数值的函数。e、 并将其转换为类似正则表达式的

'\D*4\D*4\D*0\D*8\D*0\D*0\D*1\D*2\D*3\D*1\D*2\D*3\D*'
\D
[^0-9]
,以防MySQL中未定义)


这可以与普通的REGEXP命令一起使用…

您能给出确切的示例吗?@Akam请参阅edit.is+44是来自用户输入还是数据库中的内容?最好在数据库中有一列用于清理版本;即使您在运行中进行了清理,也会失去使用索引的任何机会。您可以使用REPLACE(val,,,'')匹配右侧9个字符中的字符串你能给出确切的例子吗?@Akam请查看edit.is+44来自用户输入还是数据库中的内容?最好在数据库中有一列用于清理版本;即使您在运行中进行了清理,也会失去使用索引的任何机会。您可以使用REPLACE(val,,,'')匹配右侧9个字符中的字符串