发布时间:2019-05-17作者:laosun阅读(4724)
Mysql 不可见字符,使用like可以查询到,使用等于号查询不到。前后不可见字符E280AA和E280AC.
数据库和表编码:utf8mb4
先看个有问题的SQL,这个SQL看着是真没有问题。执行也能正常进行更新。
UPDATE `t_member` SET `phone` = '159XXXX3048' WHERE `id` = 1
但是更新后,使用以下语句就是查不到
select * from t_member where phone = '159XXXX3048';
使用like '%159XXXX3048%'就能查询到,所以博主怀疑是前后有不可见字符。 那么如何确定呢
拷贝上边update语句的手机号,我们一个一个的进行删除,你就会发现前后会多出一次回车,都是在单引号里边
'159XXXX3048'
好了,废话不多说,我们来看看这个不可见字符是什么吧
执行一下以下语句
select hex(phone) from t_member where id = 1;
打印字符为
E280AA3135395858585833303438E280AC
然后我们将结果保存下来,等会对比一下
我们现在执行一下正常的手机号,update语句
UPDATE `t_member` SET `phone` = '159XXXX3048' WHERE `id` = 1
再执行一下以下语句
select hex(phone) from t_member where id = 1;
观看结果
3135395858585833303438
我们将结果对比一下
E280AA3135395858585833303438E280AC 3135395858585833303438
是不是发现前后各有一串字符,E280AA 和 E280AC
其实这俩是个十六进制字符,我们使用系统自带计算器将其转换成十进制字符,然后替换就可以解决了。
比如下图,我的转换方式
如上图所示:点击10,转换成 14844074,相同,E280AC 转换成 14844076
然后使用下边的语句进行替换。
update t_member set phone = replace(phone, CHAR(14844074),''), phone = replace(phone, CHAR(14844076),'') where id = 1;
替换后我们再查询就没问题了。
至于为什么会发生这种情况,博主初步分析是华为手机自带邮箱客户端拷贝的问题。
版权属于: 技术客
原文地址: https://www.sunjs.com/article/detail/a50db9f6aff8437083be20a3790002ac.html
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。