经由上面的处理本来以为就没有什么问题了,但是由于我们对base64编码的编码事理并不是很理解,以是就导致我们在接下来的开拓过程中掉进了一个我们自己给自己挖的坑中去了。
新的需求是这样的:可以通过身份证号的后4位或者后6位模糊查询出用户信息,当然也可以通过完全的身份证号将这个用户的信息查找出来。
通过完全的身份证号进行检索当然很随意马虎实现,直接将输入的身份证号也进行base64编码然后去数据库中查找即可。

然而对付身份证号的后4位或者6位编码之后再去数据表中通过like关键字匹配是否可行呢?当然我们开始也是这样去做的。
我们想当然地认为,完全的身份证号base64编码之后的字串包含其后4位或者6位base64编码的字串。
比如说先编码一个身份证号:

<?php echo base64_encode('153933199401281934'); // output --- MTUzOTMzMTk5NDAxMjgxOTM0

然后对其后6位编码

php64位encodebase64编码道理与隐约查询 React

<?php echo base64_encode('281934'); // output --- MjgxOTM0j

看到结果和预想的一样。
以是立时就很愉快地用like去匹配了。
但是当编码后4位的时候却创造结果涌现了非常

<?php echo base64_encode('1934'); // output --- MtkzNA==

在完全的身份证号的base64编码字串中并没有包含后四位的编码字串。
那就解释直策应用like去匹配还是行不通的。

这时以为还是有必要去理解一下base64到底是如何编码的,心腹知彼方能百战不殆。

base64编码事理

base64编码之以是叫base64,那是由于它是基于64个字符的编码办法,这64个字符为:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 。

这些字符和数值之间有一个对应表,全体的编码都是按照这个对应表来进行的。

Base64编码字符和数值对照表

为什么又要用64个字符呢,由于2的6次方为64,恰好可以表示64个字符。
举例来说,根据上面的对应表格,000000对应'A',000001对应'B',000002对应'C',111110对应'+'。

然而,我们知道1字节即是8位。
当拿到一个字符串的时候,首先找到每个字符对应的ascII码,再将ascII码转换成8位二进制表示('A'=65=01000001)。
然后将字符串转换成的二进制串再按照每6位为一组进行划分。
这样用每6位二进制数对应的十进制数去上面的对照表中取出相应的字符。
举个例子:对'PHP'进行base64编码

字符串PHP的Base64编码对照表

以是字符串'PHP'经由base64编码后为 'UEhQ'。

上面的情形比较分外,三个字符按照8位为一字节来打算,恰好为24位。
然后再按照每6位为一组,恰好是四组。
但是,如果对原始字符串经由二进制转换之后不是24位,而是32位,那再按照每6位为一组进行划分则末了一组只有两位。
前面的5组转换成十进制数之后在对照表中找出相应的字符,那末了一组才有两位该如何转换为十进制呢?实在很大略,在其后面用0补充到6位,然后再进行转换。
当然,到此还没有结束。
虽然每组都补齐了6位,但是经由用0补充往后,总的位数不一定能被8整除。
以是说还须要再用'='表示一个6位依次向后补充,直到总的位数能再次被8整除。
下面我们在例一的根本上编码'PHPS'。

字符串PHPS的Base64编码表

我们看到,在上面经由0补充后为36位,不能被8整除。
然后再用'='表示一个6位依次向后补充,末了当补充两个'='时为48位,能被8整除。
此时编码终止,末了对'PHPS'经由base64编码之后为'UEhQUw=='。

Base64编码紧张用在传输、存储、表示二进制等领域,还可以用作大略的加密,但只是一眼看上去不知道什么内容而已,但是可以通过其编码规则对其进行解码。

填坑

通过对base64编码事理的深入理解,创造对付身份证号模糊查询的实现方案根本行不通。
既然行不通,那只有反向解码然后再进行模糊查询。

所谓的反向即是在sql中先对要检索的字段进行解码,然后用解码的值去匹配我们要查询的身份证号。
这样就须要我们的mysql支持base64编码/解码的聚合函数。
经由查找创造在mysqL5.6的版本以及5.6版本之上才会支持。
以是我们须要升级我们的mysql至少为5.6版本。

下面是须要的sql

select name,id_card from users where from_base64(id_card) like ‘%1533’;

当然在实际运用中会将1533动态换成我们的输入的身份证号的后4位或者后6位。

这样我们的问题就圆满地办理了。
我们创造要办理我们的问题实在也很大略,便是一条sql语句就搞定了。
但是,找到这个方法的过程还是挺值的。
通过这个问题我们深入地理解了base64编码的事理,这对我们往后再在设计程序方面有很大的帮助。