众所周知,身份证是唯一的。
但是有一个人突然问到,我们数据库中的身份证后四位是唯一的吗?能否查询一下数据库?
非严谨解释
在不进行数据库验证的前提下,我们只是从逻辑上想一下,身份证一共18位,后四位,即生日后的四位数,那么即使再怎么排列,最多也就是 101010*11个组合,肯定是会重复的。
严谨解释
我们再从严谨的逻辑来理解一下
身份证的排列规则:
身份证号码是由18位数字组成
第1、2位数字表示:所在省份的代码
第3、4位数字表示:所在城市的代码
第5、6位数字表示:所在区县的代码
第7-14位数字表示:出生年、月、日(其中7、8、9、10位是年,11、12位是月,13、14位是日)
第15-17位都是同一地址辖区内的,以及同年同月同日出生人的顺序码,同时第17位兼具性别标识功能,男单女双
第18位数字是校检码:可以是0-9的数字,有时也用X表示
所以,在不同的省市区,身份证后四位是可以重复的。
数据库验证
是的,我们是程序员,当理论无法让人接受的时候,我们可以使用数据来说服他人。
这里我的数据库是mongo数据库,所以,我的查询语句如下
db.user.aggregate([
{
$match: {
//请原谅数据库中那些不规范的身份证号
card_id: {
$exists: true,
$nin: ["", null]
}
}
},
{
$project: {
"_id": 1,
"name": 1,
"card_id": 1,
"card_id_info": {
$substr: ["$card_id", 14, 4]
}
}
},
//请原谅数据库中那些不规范的身份证号
{
$match: {
card_id_info: {
$nin: ["", null]
}
}
},
{
$group: {
_id: "$card_id_info",
count: {
$sum: 1
},
//增加输出
uniqueIds: {
"$addToSet": {
_id: "$_id",
name: "$name",
card_id: "$card_id",
card_id_info: "$card_id_info"
}
}
}
},
{
//让我们看看重复的多的是哪些
$sort: {
count: - 1
}
}
])
寄语
数据无情但真实