大文本字符串取出丢失内容
今天发现一个非常奇怪的问题,我保存一个很大的文本进数据库,然后取出来的时候发现少了不少内容。测试之后发现是Laravel的问题,用PDO查询是不会丢失的。
数据表结构如下:
CREATE TABLE `articles` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`content` longtext NOT NULL COMMENT '内容',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4
测试代码如下:
$article = new \App\Models\Article();
$article->title = 'test';
$article->content = str_repeat('a', 2000000);
$article->save();
$id = $article->id;
$data1 = \App\Models\Article::find($id);
var_dump(strlen($data1->content));
$dbh = new PDO('mysql:host=localhost;dbname='.env('DB_DATABASE'), env('DB_USERNAME'), env('DB_PASSWORD'));
$sth = $dbh->prepare('select * from articles where id = :id limit 1');
$sth->bindValue(':id', $id);
$sth->execute();
$data2 = $sth->fetch(PDO::FETCH_OBJ);
var_dump(strlen($data2->content));
结果如下:
int 1048576
int 2000000
PS:小于1048576
的字符串是正常的,大于这个数字的都只返回1048576
的长度
请问有知道这是什么问题的吗??这个神奇的数字是什么?
这个神奇的数字是1024*1024
写了个demo,没有复现你的问题
@leo 不好意思,没有看到回复。
我在laravel 5.1和5.3新创建的框架都试过有这个问题,但没有找到具体出现的原因。
开发环境:
OS X,PHP 7.0.14,MySQL5.7.17
是否有相关的参数没配置好?
但既然PDO能查到应该不是PHP的问题,奇怪的很啊。
目前用最笨的方法暂时“处理”了这个问题:
哎呀我的天啊,每次看到这段代码都一阵阵心痛
你看下
my.cnf
中的max_allowed_packet
值是不是1M
@Vanry 我的配置是max_allowed_packet = 16M
我觉得如果PDO能正常获取,那应该不管PHP和MySQL的问题
坐等答案
@生活无限好 你也遇到这个问题?
@Vergil 没有,不过觉得这个很好玩
Mark 一下
@生活无限好 你有兴趣可以试试运行上面的代码看看有没这个问题,前面的人回复说没有,但我这边开发机和服务器确实也遇到