Laravel Eloquent对象,longtext被截断

wak*_*man 2 php mysql json longtext laravel

我使用Laravel,将db行加载到Eloquent对象中.其中一列是longtext,一个JSON编码的数组> 200万个字符长.我得到的原始错误是json_decode在此列的值上失败.

我在修补中测试过.简化的测试代码:

$item = Item::find(1);
echo $item->long_text_field;
var_dump(json_decode($item->long_text_field));
echo strlen($item->long_text_field);
Run Code Online (Sandbox Code Playgroud)

在我的本地vagrant实例上,它显示正确的值.

...long json array in text, same as the value in the actual DB entry...
...var_dump of json array...
2334040
Run Code Online (Sandbox Code Playgroud)

但是在我的远程开发服务器上我得到了

...long json array truncated in the middle...
NULL
1048576
Run Code Online (Sandbox Code Playgroud)

显然json_decode失败了,因为字符串被截断了.

它截断了这样的一块

"Eff Date":"1\”
Run Code Online (Sandbox Code Playgroud)

应该是哪个

"Eff Date":"1\/30\/14 16:13”
Run Code Online (Sandbox Code Playgroud)

从长远来看,这里有很多逃脱的斜线,在这一点上我看不到任何奇怪的角色.有没有人知道为什么这个文本会在一台服务器而不是另一台服务器上截断?

Ian*_*ick 8

问题是默认PDO::MYSQL_ATTR_MAX_BUFFER_SIZE大小是1Mb.

要在Laravel中设置它,您需要为database.php配置文件添加一个选项.

'connections' => [
    'mydb' => [
        'driver'    => 'mysql',
        'host'      => 'localhost',
        'database'  => 'mydb',
        'options'   => [
            PDO::MYSQL_ATTR_MAX_BUFFER_SIZE => 16777216
        ]
    ]
]
Run Code Online (Sandbox Code Playgroud)

以上将最大属性大小设置为16Mb.

请注意,如果你使用mysqlnd驱动,你不需要这个了,它实际上会破坏你的代码为PDO :: MYSQL_ATTR_MAX_BUFFER_SIZE不变不存在.