MYSQL中的"不可见"

2,106 阅读2分钟

工作一年多了,有个奇怪的问题(MySQL中字段存在不可见字符)已经出现了三次。如果仅仅是根据肉眼排查的话是很难排查出来的。

本地模拟数据

在我的本地数据库中存在这么一条记录。

请大家查看下remark这个字段里面的值,这里面看起来只有5个字符的长度。 我们右击复制为insert语句。

INSERT INTO `montos`.`sys_user`(`id`, `name`, `age`, `id_card`, `remark`) VALUES (107442, '1', 12, '66216503', '卢老师朋友'); 

这个时候我想说在markdown中根本看不出......我们上截图

以及在Navicat中显示的
可以清晰地看出在文字前面试有两个不可见字符(由于编码不一致问题导致产生)。

通过转化我们可以看到在中文之前是有存在两个unicode不可见字符的。

解决道路

  1. 我们首先在数据库中查看下怀疑的字段与正常的字段对应的十六进制相差多少:
select hex("卢老师朋友"), hex(remark) from sys_user where id = '107442';

可以查看到我们的字段前面是多了十六进制对应的:0808。

  1. 在通过其他的转换工具,将十六进制的数字对应的转化为十进制进行更新:
UPDATE `sys_user` set remark = REPLACE(remark,char(2056),'');

这个时候就完美的解决了我们数据库中不可见字符的情况。当然我们不仅仅是要去解决问题,还需要知道问题的产生:

某内部业务方:怎么回事,我输入进去之后,整个页面怎么变成空白了?(前端解析json发生错误)
某后端程序员:(匆匆看了下Network),你找下**(前端人员),我数据有返回给他
某前端程序员:不是啊,你返回的数据我解析有错误,你数据有问题
某后端程序员:怎么会有这么玩意的??你们(业务方)是怎么操作的?
某内部业务方:我们就正常操作啊,就普通的输入啊
某后端程序员:。。。。发邮件洗数据