MySQL 5.7仅比较混合VARCHAR列中的数字
注意:请注意,这与标题类似的问题不同(请参阅下面的“我尝试了什么”) 背景: 我需要在数据库字符串列中搜索与给定搜索条件匹配的电话号码 数据库列是一个varchar,包含用户提供的各种附加字符(即非数字字符) 我最初的想法是使用一个系统将列字符串转换为纯数字格式(在PHP中,这将通过PCRE函数),然后进行直接的缩进比较 持有的数据示例: 有多种人类可读的格式,这些格式由最终用户提交,通常是历史性的 问题: 我找不到在这列中搜索数字的方法。我将PHP中的搜索字段精简为仅数字(0-9)。我想试试这样的东西: “搜索“电话”列,并查找纯数字值(来自混合字符串)与给定搜索字符串完全匹配的位置 (伪代码:) (:searchNumber是PDO占位符。) 搜索词示例: “015764567” 预期产出: 通过在SQL查询中输入搜索词,我希望能够检索id号。在上面的搜索示例中;MySQL 5.7仅比较混合VARCHAR列中的数字,mysql,sql,Mysql,Sql,注意:请注意,这与标题类似的问题不同(请参阅下面的“我尝试了什么”) 背景: 我需要在数据库字符串列中搜索与给定搜索条件匹配的电话号码 数据库列是一个varchar,包含用户提供的各种附加字符(即非数字字符) 我最初的想法是使用一个系统将列字符串转换为纯数字格式(在PHP中,这将通过PCRE函数),然后进行直接的缩进比较 持有的数据示例: 有多种人类可读的格式,这些格式由最终用户提交,通常是历史性的 问题: 我找不到在这列中搜索数字的方法。我将PHP中的搜索字段精简为仅数字(0-9)。我想试试这
$result['id']=1;
限制:
这只在MySQL版本5.7上。我不能在这里使用MySQL 8.0
将电话列转换为数字列类型将需要大量的辅助工作,而我们现在没有时间灵活性来完成这项工作
我所尝试的:
- 在MYSQL上返回的是
/true
(0/1),而不是REGEXP处理的输出字符串false
到大小写
/有符号
不起作用,因为它在字符串中的任何空白处都会断开,还可以删除前导零无符号
- 我读过
- 如果所有其他操作都失败,我可以导出所有数字,并通过PHP循环运行它们,该循环将执行相同的操作:
$searchNumber = preg_replace('/[^0-9]/','',$searchNumberSource); foreach ($numberFromDb as $row){ if(preg_replace('/[^0-9]/',''.$row) === $searchNumberSource){ // Matching number is found. break; } }
- 一种简单的方法是嵌套使用replace
select replace(replace(replace(telephone,' ',''), '-',''), '+','')
您应该修复数据,使其与您想要的使用方式相匹配。这可能需要一些努力,但修复数据将简化正在进行的代码,而不是进行繁重的工作 我的建议是在应用程序端进行更改。将数字更改为正则表达式:
SELECT telephone, id
FROM phones
WHERE telephone REGEXP :searchNumber_regex;
然后,“01576456567”
的searchNumber\u regex将如下所示:
'^[^0-9]*0[^0-9]*1[^0-9]*5[^0-9]*7[^0-9]*6[^0-9]*4[^0-9]*5[^0-9]*6[^0-9]*5[^0-9]*6[^0-9]*7[^0-9]*$'
基本上,模式
[^0-9]*
位于每个数字的开头和结尾之间。您向我们提供了示例表数据,但您没有告诉我们搜索词是什么,也没有告诉我们预期的输出是什么。你能把这个也包括进来吗?@TimBiegeleisen啊对不起,我已经更新了我的问题。这是个好主意,但我担心的是我需要手动列出电话号码VARCHAR中出现的非数字值。“理想情况下,我希望找到一种避开这一潜在障碍的方法。”马丁。。我过去试过好几次了。。我的尝试也结束了。。基于SQL的独特方式是使用replace。。无论如何,这可能至少是一个起点。我的大脑一直停留在正则表达式方法上,我忽略了替换,但是是的,现在测试它是可行的。。。我现在只需要在tabe列:-D
中创建一个非数字字符的定义列表。谢谢。@martin。。如果我的答案是正确的,请正确地标记它。我曾考虑过这种方法(使用REGEXP比较),但这似乎是一项非常繁重且冗长的工作,我宁愿将其全部导出到PHP并使用我的PHP字符串处理方法。@Martin。在数据库中进行字符串处理的成本可能更低,尤其是如果您有一个更大的表。将数据从数据库移动到应用程序的成本相对较高。
SELECT telephone, id
FROM phones
WHERE telephone REGEXP :searchNumber_regex;
'^[^0-9]*0[^0-9]*1[^0-9]*5[^0-9]*7[^0-9]*6[^0-9]*4[^0-9]*5[^0-9]*6[^0-9]*5[^0-9]*6[^0-9]*7[^0-9]*$'