您现在的位置是: 网站首页> PHP> Laravel Laravel

PHP中PDO连接方式获取字段文本内容被截取,字段被截取为1M(长度为1048576)的异常问题和处理方式

Smile 2022-01-23 PHP Laravel MySQL 阅读:695

简介我的数据库中的文章表内容字段类型为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)

文章评论

站点信息