优搜集

读文章·学知识

Mysql查询不到字段值为Unicode编码的字符

4696 人参与 | 时间:2018-10-07 10:29:58

刚刚检查后台发现一个地方的搜索之前的技术忘记做了,所以就给后台添加了一个用户搜索功能,但是万万没想到的是很简单的一个东西竟然花费了1个多小时来解决,下面是整个事情的经过。

首先数据库中字段的值是以json格式存储的,不知道以前为啥这么设计,整个表里用户相关的信息都存储在‘card’字段中,其他字段基本上没有需要检索的数据。而用户的信息不可避免的包含中文,所以在json_encode后存储到数据库中文部分就转换成立unicode编码。如下所示:

  1. {"realname":"\u9a6c\u672a\u90fd","identity_card":"42049982688888"}

看到数据后没有多想就按常规的查询方法进行查询了。

  1. $user_name = input('username','','trim');

  2. if($user_name){

  3.     $user_name = trim(json_encode($user_name),'"');

  4. }

  5. $data = Db::name("表名")->where('字段','like',"%{$user_name}%")->order(...)->select;

结果发现,查询结果是空数据。索性又用原生的sql语句在客户端查了一次,还是空的。我勒个擦!

最后在segmentfault上面一个大神指点说,在mysql里,“\" 是需要转义的。mysql斜杆转义之后,会去转义别的字符,所有要得到斜杆,需要在加一个斜杆去转义。)最后改为四个斜杆“\\\\”,这样才得到一个“\”。因此使用”\\”来查询,数据依然是空。

所以尝试了下在需要匹配的字符斜杠前面加上“\\\\”后查询出了正确的结果。所以加反斜杠是一种解决方法。参考我的提问链接https://segmentfault.com/q/1010000013919612

而另外一种解决方案则是将反斜杠“\”转换成下划线“_”。仅需要将上述第三行源码改成如下示例即可。

  1. $user_name = str_replace("\\","_",trim(json_encode($user_name),'"'));

那么问题到这里就算完整解决了,两种方法可以解决Mysql检索字段值为json格式或unicode编码时查询不到数据的问题。



标签: 海南 海南做网站 MYSQL PHP
来源:魏成博客,欢迎分享,(微信/电话:weicheng0526/18976961701)
网址:http://www.yousouji.com/index/detail/6.html
本站由魏成开发搭建,由魏成提供技术支持,内容采用互联网转载及站长个人分享的形式。本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,予以删除QQ343420553。
导读
站内搜索
7天内热点
友情链接
Copyright © 2018-2050 优搜集 版权所有 | 版权声明 | 发展历程 | 广告投放 | 本站简介 | 站长QQ:343420553 | 粉丝交流QQ群:39324498
本站由魏成开发搭建,由魏成提供技术支持,内容采用互联网转载及站长个人分享的形式。本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,予以删除QQ343420553。
琼ICP备13002698号-2