在解决上一个微信授权不断刷新的bug时候又发现,某些用户碰到另一个问题就是微信授权获取的用户微信昵称里面带有emoji图案,无法写入到数据库,导致query失败而无法授权登陆成功。
这个问题网上有很多解决的办法,有的说把数据库或者数据表的编码改成utf8mb4就可以了,但是我将这个改过去之后,依然没有解决这个问题,用户信息还是不能写入到数据库。
我将自己的昵称改成加emoji的之后发现,我还是可以写入到数据库里的,但是帮忙测试测试的三位用户(很巧,全都是微信昵称里带有emoji头像的)却就是写不进去,所以我猜测只有部分emoji是可以直接写进入utf8mb4编码的,而那三位用户的emoji都是不太常见的emoji表情,可能这几个就是不能写进去的?
没有办法,我只好从代码里面去想办法,网上说只要加密就行了,有几种方式,encode、urlencode、base64_encode等等,最终我采用的是base64_encode的方式,先把用户的昵称加密之后,再写入数据库,终于成功。
但这样也带来了一个很大的工作量:第一,加密写入到数据库,读取的时候就需要解密,这就需要改动所有使用到了用户昵称的页面的代码;第二,目前数据库的用户名称都是没有加密的,需要把所有的用户名都加密才行。
第一点就是费时费力一点,第二点,原本我希望通过执行一个php页面来加密,后来发现mysql可以直接用语句来执行,使用的不是base64_encode函数,而是TO_BASE64(字段名)函数直接执行就行。
这个问题虽然是新发现的,但是也费了好长时间才解决。而之前不能登录那个问题,真是折腾了我好几个早上……总之,这次可真是学到东西了。