NOTE: Please note this is NOT the same as similarly titled questions (see "What I've Tried", below)
背景:
我需要在数据库字符串列中搜索符合给定搜索条件的电话号码。
数据库列是一个带有各种用户提供的附加(即非数字)字符的 varchar。
我最初的想法是使用一个系统将列字符串转换为纯数字格式(在 PHP 中这将通过 PCRE 函数),然后进行直接的相同比较
持有的示例数据:
id telephone: ---------------------- 1 '01576 456 567' 2 '07768345998' 3 '+447588 43 34 56' 4 '01524-901-335'
有多种人类可读的格式,这些格式由最终用户提交并且通常具有历史意义。
问题:
我找不到在该列中搜索数字的方法。我已将 PHP 中的搜索字段精简为仅数字 (0-9)。我想尝试类似的东西:
"Search the telephone column and find where the numeric ONLY value (from a mixed string) matches the given search string exactly.
(pseudo-code:)
SELECT telephone, id FROM phones WHERE REGEX_REPLACE(`telephone`, '[^0-9]') = :searchNumber
(:searchNumber 是 PDO 占位符。)
示例搜索词:
"01576456567"
预期输出:
通过在 SQL 查询中输入搜索词,我希望能够检索 ID 号。在上面的搜索示例中; $result['id'] = 1;
限制:
这仅适用于 MySQL 5.7 版。我不能在这里使用 MySQL 8.0。
将电话列转换为数字列类型会导致大量次要工作,而我们现在没有时间灵 active 来执行此操作。
我尝试过的:
MYSQL 上的 REGEXP type functions 返回
true
/false
(0/1) 而不是 REGEXP 处理的输出字符串。CASE
到SIGNED
/UNSIGNED
不起作用,因为它会在字符串中的任何空格处中断,并且还会删除前导零。
免责条款:
如果我的查询令人困惑,此 PHP 代码可能会更好地说明我正在努力实现的目标。
如果所有其他方法都失败了,我可以导出所有数字并通过执行相同操作的 PHP 循环运行它们:
$searchNumber = preg_replace('/[^0-9]/','',$searchNumberSource); foreach ($numberFromDb as $row){ if(preg_replace('/[^0-9]/',''.$row) === $searchNumberSource){ // Matching number is found. break; } }
最佳答案
一个简单的方法是嵌套使用替换
select replace(replace(replace(telephone,' ',''), '-',''), '+','')
关于MySQL 5.7 仅比较混合 VARCHAR 列中的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56540131/