$cfg['LimitChars']仅控制前端显示截断,不影响数据库存储;“完整文本”通过新请求获取原始值,导出则仅打包已渲染的截断内容,二者路径独立。

$cfg['LimitChars'] 是唯一控制单元格内容显示长度的开关,不是 bug,也不是数据库限制——它在 PHP 层就把字符串切掉了,后续所有操作(包括导出、复制、点击“打开”)都基于这个已截断的结果。
为什么点「完整文本」能看全,但导出还是只有前 50 字符?
因为「完整文本」是点击后单独发起一次新请求,绕过了前端渲染逻辑;而导出按钮只打包当前页面已渲染的 <td> 内容。这两条路径完全独立:
– 渲染用的是 $cfg['LimitChars'] 截断后的值
– 「完整文本」走的是 tbl_row.php + getPartialValue(),查原始字段再输出
– 导出不重新查询,只做 HTML → CSV/JSON/XML 的格式转换
所以即使你点开过 10 条记录的完整内容,导出时依然只能拿到那 50 字符
改 $cfg['LimitChars'] 就能一劳永逸?
不能。这个配置只影响显示,不解决根本瓶颈:
– 设为 0:浏览器可能卡死,尤其含上百行、每行多个 JSON 字段时
– 设为 5000:单个 TEXT 字段若真有 10 万字符,phpMyAdmin 仍要一次性加载、解析、渲染,PHP 内存和响应时间会飙升
– 它对 JSON、XML 导出格式无效:这些格式有自己硬编码的行数限制(如 JSON 默认只导 50 行),跟 $cfg['LimitChars'] 无关
真正该做的,是在需要查长文本时主动切换工具:用 mysql --vertical 或 SELECT ... \G,而不是强求 phpMyAdmin 承担不该它干的活
为什么「显示所有」之后,TEXT 字段还是被截断?
「显示所有」只解除行数限制(即去掉隐式 LIMIT 1000),但它不碰字段内容长度控制。
你看到的仍是受 $cfg['LimitChars'] 约束后的结果。验证方法:
– 鼠标悬停在被截断单元格上,等几秒看 tooltip 是否弹出全文(部分版本支持)
– 点击右侧「打开」图标,弹窗里才是原始值
– 若连 tooltip 和弹窗都不全,说明数据本身已被写入时截断(比如字段定义是 VARCHAR(255),但插入了 300 字符),这时得查 SHOW WARNINGS; 和 LENGTH()
导出 CSV 后 Excel 里换行错位,是截断吗?
不是截断,是格式解析失败。CSV 导出默认不加引号包裹字段,而 TEXT 字段若含换行符、逗号或双引号,Excel 会误判为新行或新列。
解决方法只有两个:
– 在 phpMyAdmin 导出页勾选「使用引号包裹字段」
– 或直接放弃 CSV,改用 mysqldump --tab 或 mysql -e "SELECT ..." | sed 's/\t/,/g' 生成更可控的分隔格式
别指望改 $cfg['LimitChars'] 能修好这个
立即学习“PHP免费学习笔记(深入)”;
复杂点在于:截断行为分布在三层——MySQL 写入层(字段定义+严格模式)、phpMyAdmin 渲染层($cfg['LimitChars'])、导出格式逻辑层(JSON/XML 硬编码限制)。想靠一个配置项统一解决,只会反复踩坑。



















