MySQL 5.7仅比较混合VARCHAR列中的数字

MySQL 5.7仅比较混合VARCHAR列中的数字,mysql,sql,Mysql,Sql,注意:请注意,这与标题类似的问题不同(请参阅下面的“我尝试了什么”) 背景: 我需要在数据库字符串列中搜索与给定搜索条件匹配的电话号码 数据库列是一个varchar,包含用户提供的各种附加字符(即非数字字符) 我最初的想法是使用一个系统将列字符串转换为纯数字格式(在PHP中,这将通过PCRE函数),然后进行直接的缩进比较 持有的数据示例: 有多种人类可读的格式,这些格式由最终用户提交,通常是历史性的 问题: 我找不到在这列中搜索数字的方法。我将PHP中的搜索字段精简为仅数字(0-9)。我想试试这

注意:请注意,这与标题类似的问题不同(请参阅下面的“我尝试了什么”)

背景: 我需要在数据库字符串列中搜索与给定搜索条件匹配的电话号码

数据库列是一个varchar,包含用户提供的各种附加字符(即非数字字符)

我最初的想法是使用一个系统将列字符串转换为纯数字格式(在PHP中,这将通过PCRE函数),然后进行直接的缩进比较

持有的数据示例: 有多种人类可读的格式,这些格式由最终用户提交,通常是历史性的

问题: 我找不到在这列中搜索数字的方法。我将PHP中的搜索字段精简为仅数字(0-9)。我想试试这样的东西:

“搜索“电话”列,并查找纯数字值(来自混合字符串)与给定搜索字符串完全匹配的位置

(伪代码:)

(:searchNumber是PDO占位符。)

搜索词示例: “015764567”

预期产出: 通过在SQL查询中输入搜索词,我希望能够检索id号。在上面的搜索示例中;
$result['id']=1;

限制: 这只在MySQL版本5.7上。我不能在这里使用MySQL 8.0

将电话列转换为数字列类型将需要大量的辅助工作,而我们现在没有时间灵活性来完成这项工作

我所尝试的:
  • 在MYSQL上返回的是
    true
    /
    false
    (0/1),而不是REGEXP处理的输出字符串

  • 大小写
    有符号
    /
    无符号
    不起作用,因为它在字符串中的任何空白处都会断开,还可以删除前导零

  • 我读过

免责条款: 如果我的查询令人困惑,那么这段PHP代码可能是我试图实现的更好的示例

  • 如果所有其他操作都失败,我可以导出所有数字,并通过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]*$'