有效匹配电话号码

And*_*eas 5 mysql format

对于移动应用程序,我们正在考虑根据用户的手机号码验证用户。

在应用程序中,我们将限制用户输入,以便将其存储为以下格式:

  • +46700112233

在这种情况下,这意味着瑞典的电话号码 (+46),删除最初的 0,然后保留剩余的 9 位数字(此处的手机号码是 10 位数字,包括前导 0)。

但是,当前保存在数据库中的数据包括很多行,并且没有对输入进行验证。这意味着保存的数字可以是多种不同的格式,包括

  • 0700112233

  • 070-0112233

  • 460700112233

    等等。

所以数据库中列的类型可能是varchar

目前,我无法将数据库中已保存的数字实际更新为一种通用格式,例如使用libphonenumber。我也希望限制对数据库的实际查询次数。

该数据库目前包括以不同格式保存的大约 10 多个国家的电话号码。使用的 DBMS 是 MySQL。

在不查询任何可能格式的数据库的情况下,准确匹配数字的有效方法是什么?

Jam*_*mes 0

这可能是一件很奇怪的事。我首先使用替换功能来删除所有垃圾('(',')','-')。您也可以将其普遍添加,尽管这会更困难。它看起来像这样:

    select replace(replace(replace(p.phone,'-',''),'(',''),')','') 
    from people p
Run Code Online (Sandbox Code Playgroud)

要使每个数字都是 10 位数字,如果较短,则在左侧添加零,您可以这样做:

    select right( '0000000000' + replace(replace(replace(p.phone,'-',''),'(',''),')',''),10)
    from people p  
Run Code Online (Sandbox Code Playgroud)

至于国家/地区代码......理想情况下,它们应该在自己的列中,但您可以稍后将它们添加回来,如下所示:

    select '011' + right( '0000000000' + replace(replace(replace(p.phone,'-',''),'(',''),')',''),10)
    from people p
    where country = 'America'
Run Code Online (Sandbox Code Playgroud)

完整的东西看起来像这样(如果它是一个非常大的表,请考虑对其进行批处理):

    select * into people_bak from people

     update p
     set Phone = 
    '011' + right( '0000000000' + replace(replace(replace(p.phone,'-',''),'(',''),')',''),10)
    from people p
    where country = 'America'

    select PostalCode, * from people
Run Code Online (Sandbox Code Playgroud)