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

刚刚检查后台发现一个地方的搜索之前的技术忘记做了,所以就给后台添加了一个用户搜索功能,但是万万没想到的是很简单的一个东西竟然花费了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编码时查询不到数据的问题。

你想把广告放到这里吗?

发表评论

您必须 登录 才能发表留言!