phpMyAdmin导出TEXT字段被截断是因前端渲染时受$cfg['LimitChars']限制(默认50字符)且导出仅基于已渲染内容,而非原始数据;同时存在隐式LIMIT行数限制及不同导出格式的独立硬编码限制。

导出时TEXT字段被截断,不是数据丢了,而是phpMyAdmin默认只显示并导出“当前渲染的单元格内容”,而这个内容本身已被前端截断过一次。
导出只取当前页面渲染结果,不是原始数据
phpMyAdmin导出按钮(尤其是「快速导出」)不会重新执行查询,它只把当前浏览器里已经渲染出来的表格内容打包成文件。而这些内容早已受 $cfg['LimitChars'] 控制——比如默认值是 50,意味着每个单元格最多导出前 50 个字符,后面直接砍掉,加省略号。
- 即使你查的是
SELECT content FROM posts,只要content是 TEXT 类型且超长,phpMyAdmin 就会先按$cfg['LimitChars']截断再渲染,导出时自然只有那 50 字符 - 验证方法:在结果页点击某条记录右侧的「完整文本」链接,如果能展开看到全量内容,说明数据完好,只是显示层做了限制
- 这个行为和 CSV/JSON/XML 格式无关,所有导出格式都共享同一套前端渲染结果
SQL 查询里没写 LIMIT 0,也可能被后台隐式加 LIMIT
某些 phpMyAdmin 版本(如 4.9+)会在你没显式写 LIMIT 的情况下,自动给 SELECT 查询加上 LIMIT 1000 防卡顿。导出时仍走这条路径,导致只拿到前 1000 行,且每行字段还被 $cfg['LimitChars'] 再切一刀。
- 解决办法:在 SQL 标签页执行查询时,明确加上
LIMIT 0或删掉隐含限制(需改配置或用命令行验证) - 注意:
LIMIT 0不代表不返回,而是取消行数限制;部分旧版本需写LIMIT 999999替代 - 若用「浏览」页导出,务必先点「全选所有 X 行」链接,否则永远只导当前分页(如 30 行)
导出格式本身有硬编码限制,尤其 JSON 和 XML
不是所有格式都平等。phpMyAdmin 对不同导出格式做了独立限制,有些甚至不走通用渲染逻辑,而是另起一套处理流程。
立即学习“PHP免费学习笔记(深入)”;
-
JSON导出在 4.9 版本中默认硬编码限制为 50 行,且跳过含 BLOB 的整行,不管$cfg['MaxRows']设多少都没用 -
XML会把 NULL 值序列化为<value xsi:nil="true"/>,部分解析器误判为空节点,看起来像“数据消失” -
CSV若字段含换行符、逗号或引号,又没勾选「使用引号包裹字段」,Excel 打开后会错行,误以为数据不全
真正要盯住的是两层截断:第一层是 $cfg['LimitChars'] 对单字段长度的控制,第二层是导出逻辑对结果集行数和格式的独立限制。改配置、点全选、换格式、甚至绕过 phpMyAdmin 直接用 mysqldump 或 mysql --vertical,得根据场景拆解应对——别指望一个开关解决全部。



















