有人存身份证号时丢掉最后一位吗

2022-09-12 13:32:44 +08:00
 iseki
最后一位校验位去掉,剩下的部分按数字存 int64 理论上没问题,有人考虑这么干吗
6028 次点击
所在节点    问与答
44 条回复
agagega
2022-09-12 15:45:53 +08:00
身份证号分段存 int 里,不到 50 位也能解决。所以就算存校验位你也可以单独拿出来。
ClarkAbe
2022-09-12 15:54:37 +08:00
你们身份证存明文?不过等保不怕泄漏嘛
wxf666
2022-09-12 16:14:14 +08:00
@IvanLi127 @dcsuibian 一般身份证的模糊搜索,都是些啥需求呢?

- 查找所有 x 省 y 市 z 区 /县 的人?
- 查找所有 35 岁以上的人?
- 查找所有 x 省 y 市 z 区 /县 20 岁 ~ 35 岁 的人?
wxf666
2022-09-12 16:19:20 +08:00
@agagega 分段存。。咋存能 < 50 位?

是想办法去除不可能存在的数字吗?

比如用 16 位来存出生年月日(足够 180 年)?
dcsuibian
2022-09-12 16:59:56 +08:00
@wxf666 对啊,就这种用字符串做的话就很方便啊。
更一般点,最最普通的模糊搜索,就是写身份证片段,然后列出所有相关的吧。字符串 like 一下就很简单,但换成数字就很难做的。
jim9606
2022-09-12 17:17:35 +08:00
不是为了极限缩减数据库存储的没必要这么搞。
要知道存证件号的字段有可能扩展为存任意证件号,难道你们会为每一种证件类型开一列?
wxf666
2022-09-12 18:11:58 +08:00
@dcsuibian 假设用『校检位视为两位数(那么身份证就是 19 位)』方法:

(`SQL` 大意,具体写要改成 `DIV`、`CAST(1e13 AS UNSIGNED)` 等)


1. 查找所有 x 省 y 市 z 区 /县 的人

- 不用索引:`身份证号 / 1e13 = 123456`

- 要用索引:`身份证号 BETWEEN 1234560000000000000 AND 1234569999999999999`


2. 查找所有 35 岁以上的人

- 不用索引:`身份证号 / 1e5 % 1e8 < 19870912`


3. 查找所有 x 省 y 市 z 区 /县 20 岁 ~ 35 岁 的人

- 要用索引:`身份证号 BETWEEN 1234561987091200000 AND 1234562002091299999`
agagega
2022-09-12 18:14:03 +08:00
@wxf666
前六位所在地用 20 位整数可以表示(如果熟悉相关国家标准还可以进一步压缩)
出生年存 8 位整数,表示 1900 年以来的年数
出生月存 4 位整数
出生日存 5 位整数
最后 3 位存 10 位整数

虽然这样挺无聊的…
NXzCH8fP20468ML5
2022-09-12 18:21:58 +08:00
你们这些人好勇啊。
用大量身份证进行遍历,准不准另说,合规就是大问题吧。
wxf666
2022-09-12 18:24:22 +08:00
@dcsuibian

修改一下:

`身份证号 / 1e5 % 1e8 < 19870912` 应该可以改成 `身份证号 % 1e13 < 1987091200000`


> 写身份证片段,然后列出所有相关的

这个需求,是不是要一直扫表了。。

实在不行,就实时转换成原身份证号再 LIKE 呗:

CONCAT(身份证号 DIV 100, MID('0123456789X', 身份证号 % 100 + 1, 1)) LIKE ...
wxf666
2022-09-12 18:39:37 +08:00
@agagega 那想得差不多一样,针对各个部分(行政区划代码、出生年月日、顺序码)进行各自编码,减少不必要的编码位浪费

也确实如你所说,意义不大。。
iyaozhen
2022-09-12 19:17:34 +08:00
@ClarkAbe 还是这位老哥说到对。信息安全任重道远呀。

之前喜欢扣位数,但现在 varchar 用的多,因为越来越多的需要加密存储了,或者一开始能得到的就不是完整的
iseki
2022-09-12 19:22:56 +08:00
@jim9606 要是我一定会单开字段,或者弄成一个 json 字段
cxk0
2022-09-12 19:32:16 +08:00
你就是想身份证存数字.那就把最后一位 X 的话,去掉一位,其他照常存,这样遇到 X 结尾的数据自然会比其他数据小一位。


非 X 直接数字可存。
mythabc
2022-09-12 19:35:21 +08:00
那护照另开一个表存吗?
奇葩的还有一堆证件号是带括号的,即使是英文字符,用户也会给你输一堆奇奇怪怪的东西进来。
dcsuibian
2022-09-12 20:22:27 +08:00
@wxf666 这么做是可以,但无论是对 DBA 和程序员来说都并不友好,增加了操作和代码的复杂度,同时在检索时还会增加数据库的计算量。

用数字存储减少磁盘占用。int64 算 8 字节,14 亿个是 10.43GB ,我这里 sizeof(身份证字符串)是 19 字节,直接算 3 倍好了。那也就是 31.2GB 。现在这个时代,省这点容量是真的划不来。

至于模糊查询,我觉得在公司、企业、学校 OA 系统中比较有可能出现。主要是这种查询多变没法提前写好。
kingjpa
2022-09-12 20:46:14 +08:00
都没做过业务层的 curd 吗?

除了金融类 哪个业务输入 18 位身份证号?

不都是后 6 位?
wellerman
2022-09-12 21:02:00 +08:00
我在业务上遇到过。分 3 段存,X 直接替换成 10 。比较完美。
panerai
2022-09-12 23:33:19 +08:00
话说你们身份证存的时候不脱敏的吗?
dlsflh
2022-09-13 07:41:30 +08:00
我想知道要是有人存了一位伟人的身份证号这时候会怎么处理?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/879424

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX