您现在的位置是: 网站首页> PHP> Laravel Laravel
PHP中PDO连接方式获取字段文本内容被截取,字段被截取为1M(长度为1048576)的异常问题和处理方式
Smile 2022-01-22 23:57:58 PHP Laravel MySQL 阅读:2026
简介我的数据库中的文章表内容字段类型为longtext类型,在Laravel中通过PDO连接方式获取该字段时,该字段的文本内容超过了1M大小,会被截断为1M(即长度为1048576)
1、问题如下图
2、产生该问题是由于PDO的配置问题导致,PDO::MYSQL_ATTR_MAX_BUFFER_SIZE PDO的预设缓冲,默认为1M,需要在 config/database.php 的mysql配置中加上,配置如下
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'prefix' => env('DB_PREFIX', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'strict' => false,
'options' => [
PDO::MYSQL_ATTR_MAX_BUFFER_SIZE => 20971520,//设置PDO的预设缓冲为20M
],
],
3、注意,如果PHP编译安装了 mysqlnd 扩展,则会导致PDO不支持 MYSQL_ATTR_MAX_BUFFER_SIZE 的预定义了,以上options配置就会报以下错误
4、如果PHP编译安装了 mysqlnd 扩展,options就不用配置 PDO::MYSQL_ATTR_MAX_BUFFER_SIZE PDO 了,则获取字段的内容大小时是就没有限制,也就说可以安装 mysqlnd 扩展也可以解决问题
5、如果PHP编译安装了 mysqlnd 扩展,可以把 PDO::MYSQL_ATTR_MAX_BUFFER_SIZE 的值打印出来,然后如下配置也不会报错
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'prefix' => env('DB_PREFIX', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'strict' => false,
'options' => [
'1005' => 20971520, //设置PDO的预设缓冲为20M
],
],
6、如果没有编译 mysqlnd 扩展,没有对 MYSQL_ATTR_MAX_BUFFER_SIZE 进行配置,则取默认1M,即单个字段文本最大为1M,超过会被截断,就会出现以上问题
很赞哦! (1)