http不返回数据,是超出了nginx返回的长度限制?还是有其他原因?

0 说明

系统为了兼容emoji表情以及其他特殊符号,在数据传入时使用urlencode()函数处理了一下数据,并将处理后的数据保存到content字段,将原字符串存到content_bak字段,使用时将content字段先urldecode()一下,然后将整组数据json_encode()之后返回给前台。

1 发现

接口一直没有任何数据返回,但http状态码为200

2 排错

1.超出了nginx返回长度限制?
不对,因为直接使用var_dump()数组的时候是可以输出的,此输出也是nginx返回的。
2.发现json_encode()数组之后返回false
调试,使用json_last_error()函数获取错误码为5即对应为JSON_ERROR_UTF8,说明数据里有非utf8的字符,是传入了一些不正常的字符吗?但就算不正常的字符也会被urlencode()然后存起来,所以应该不是数据内容有错误。
3.发现json_encode()之前的数组里有特殊的字符,在对比content_bak数据看,原因基本已经确定。
因为contentcontent_bak这两个字段是使用TEXT(MySql)存的,由于此次数据非常长urlencode()之后,长度早已超出TEXT的最长长度65535,所以只存到了urlencode()之后字符串的第65535位置,截取了半个字符,所以在json_encode()时出现了JSON_ERROR_UTF8这种错误。

3 解决

修改字段类型就可以了从TEXT改为参照下表

MySql中TEXT的种类

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容