对于移动应用程序,我们正在考虑根据用户的手机号码验证用户。
在应用程序中,我们将限制用户输入,以便将其存储为以下格式:
在这种情况下,这意味着瑞典的电话号码 (+46),删除最初的 0,然后保留剩余的 9 位数字(此处的手机号码是 10 位数字,包括前导 0)。
但是,当前保存在数据库中的数据包括很多行,并且没有对输入进行验证。这意味着保存的数字可以是多种不同的格式,包括
0700112233
070-0112233
460700112233
等等。
所以数据库中列的类型可能是varchar。
目前,我无法将数据库中已保存的数字实际更新为一种通用格式,例如使用libphonenumber。我也希望限制对数据库的实际查询次数。
该数据库目前包括以不同格式保存的大约 10 多个国家的电话号码。使用的 DBMS 是 MySQL。
在不查询任何可能格式的数据库的情况下,准确匹配数字的有效方法是什么?
这可能是一件很奇怪的事。我首先使用替换功能来删除所有垃圾('(',')','-')
。您也可以将其普遍添加,尽管这会更困难。它看起来像这样:
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)