需调整MySQL的max_allowed_packet、PHP的memory_limit和max_execution_time,以及phpMyAdmin的$cfg['MemoryLimit']和$cfg['ExecTimeLimit'],并使用自定义SQL导出且禁用二进制格式。
导出时TEXT字段被截断成“***”怎么办
phpmyadmin 默认对 blob/text 字段做长度限制(通常是 1mb 或更小),超出就显示 ***,不是数据丢了,是前端渲染被截断了。关键在服务端配置和导出方式,不是界面点几下就能解决。
- 检查 phpMyAdmin 配置里的
$cfg['LimitChars']—— 它只影响列表页显示,不影响导出,别在这儿浪费时间 - 真正起作用的是 MySQL 的
max_allowed_packet和 phpMyAdmin 的$cfg['MemoryLimit'],两者都得调大 - 导出前务必确认:你用的是「自定义导出」,而不是「快速导出」;后者默认跳过完整 TEXT 内容校验,直接截断
如何让 phpMyAdmin 导出完整 TEXT 字段(不截断)
核心是绕过前端渲染限制,走纯 SQL 导出路径。phpMyAdmin 支持「以 SQL 格式导出」+「包含数据」+「禁用二进制格式」三者组合,这是最稳的方案。
- 进入表页面 → 点「导出」→ 选择「自定义」→ 格式选
SQL - 展开「格式特定选项」→ 勾选
添加 INSERT DELAYED 语句(可选,但能缓解大 insert 压力) - 关键一步:取消勾选
使用十六进制表示二进制数据和使用 BINARY 字符串—— 否则 TEXT 会被强制转成 HEX,再导入时可能乱码或失败 - 如果字段含换行、引号、NULL 字符,确保
转义字符选项开启(默认开),否则生成的 SQL 会语法错误
导出超大表(>500MB)仍失败的排查点
不是 phpMyAdmin 不给力,是 PHP 层或 MySQL 层先扛不住。常见卡点不在界面上,而在后台配置。
- PHP 超时:
max_execution_time和memory_limit必须调高,比如设为0(不限时)和2G(注意单位是字节还是字符串,2G比2048M更可靠) - MySQL 限制:
max_allowed_packet至少设为512M,且要同时改 mysqld 和客户端连接的值(phpMyAdmin 是客户端,需匹配) - phpMyAdmin 自身限制:
$cfg['ExecTimeLimit'] = 0;和$cfg['MemoryLimit'] = '2048M';要写进config.inc.php,重启后生效 - 如果导出中途报错
Got a packet bigger than 'max_allowed_packet' bytes,说明 MySQL 层没同步改好,光改 PHP 没用
替代方案:不用 phpMyAdmin,用 mysqldump 直接导出
当 phpMyAdmin 配置调到头还崩,或者服务器不允许改配置时,命令行是最干净的选择。它不经过 PHP 渲染,TEXT 字段天然完整。
- 基本命令:
mysqldump -u root -p --single-transaction --skip-extended-insert database_name table_name > dump.sql -
--single-transaction防止大表锁死,适合线上环境 -
--skip-extended-insert让每行一个INSERT,方便后续 grep 或切分,但文件体积翻倍 - 如果字段含特殊字符或 NULL,加
--hex-blob反而是安全的 —— 这里和 phpMyAdmin 场景相反,因为 mysqldump 的 HEX 是标准解码机制,不会丢数据
复杂点在于:你得有 shell 权限,且目标服务器允许执行 long-running dump。很多共享主机禁止这个,那就只能回到 phpMyAdmin 配置死磕 —— 尤其是 max_allowed_packet 和 memory_limit 这两个值,差一点都会在最后几万行突然中断
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










