导出含JSON字段的表时,phpMyAdmin 5.1默认将双引号转义为\"导致JSON_VALID()返回0;必须选Custom导出、勾选“Enclose binary values in hexadecimal notation”并用INSERT方式,导入后以JSON_VALID()验证结果。

导出含JSON字段的表时,SQL格式默认会转义双引号导致解析失败
phpMyAdmin 5.1 默认用 SQL 格式导出时,对 JSON 类型字段的内容不做特殊处理,而是当成普通字符串用单引号包裹,并将内部双引号自动转义为 \"。结果是还原后字段值变成带多余反斜杠的字符串,JSON_VALID() 返回 0,MySQL 拒绝当作合法 JSON 解析。
必须显式启用「避免转义 JSON 字符串」机制:
- 在导出页选择
Custom导出方式(不能用Quick) - 展开
Format-specific options区域 - 勾选
Enclose binary values in hexadecimal notation—— 这个选项名字有误导性,但它实际会绕过字符串转义逻辑,让 JSON 值以0x7B226B223A2256227D十六进制形式存储,导入时 MySQL 自动识别为原始 JSON - 同时确保
Export method是INSERT(不是UPDATE或REPLACE),否则可能丢掉JSON_SET等函数生成的结构
导出后验证 JSON 字段是否真正可被 MySQL 识别
别只看导出文件里有没有 {"key":"value"} 这样的文本——那只是表象。真正要看的是导入后执行:
SELECT id, content, JSON_VALID(content) AS valid FROM your_table LIMIT 5;
如果 valid 列全是 1,说明导出无损;若出现 0,大概率是导出时没勾选十六进制选项,或导入时字符集不匹配。
常见干扰项:
- 导出时用了
UTF8而非utf8mb4,导致 emoji 或四字节字符被截断成?,连带破坏 JSON 结构 - 导入页未手动指定
Character set of the file为utf8mb4,即使导出文件本身编码正确,phpMyAdmin 也会按默认latin1解析 - 字段定义是
TEXT而非JSON类型,导出内容再规范也没用——MySQL 不做校验,但后续->操作会静默失败
用 JSON 函数筛选后导出子结构,不能依赖 phpMyAdmin 的字段选择
想只导出 JSON 字段里的某个路径(比如 data->'$.user.name'),别指望在 phpMyAdmin 导出页勾选字段名就能拿到解析后的值——它只会原样导出整个 JSON 字符串。
正确做法是先构造查询,再导出结果集:
SELECT id, JSON_UNQUOTE(JSON_EXTRACT(content, '$.user.name')) AS name FROM your_table WHERE JSON_EXTRACT(content, '$.status') = '"active"'
然后在该查询结果页点击「导出」。注意两点:
-
JSON_EXTRACT返回带双引号的字符串,必须套一层JSON_UNQUOTE才得干净值 - WHERE 条件里比较 JSON 值,要写成
'"active"'(带外层单引号 + 内层双引号),因为JSON_EXTRACT返回的是带引号字符串,不是原生类型
大数据量 JSON 字段导出容易超时或内存溢出
phpMyAdmin 5.1 在导出含长 JSON 的大表时,常卡在「正在生成输出」并最终报 500 或空白页。这不是数据问题,是 PHP 内存限制和脚本超时共同导致的。
绕过方式很直接:
- 改用命令行:登录服务器后运行
mysqldump -u user -p --skip-extended-insert --compact yourdb yourtable > json_table.sql,--compact减少换行和空格,--skip-extended-insert让每行 INSERT 对应一条记录,方便排查某条 JSON 是否损坏 - 如果必须用 phpMyAdmin,先在 SQL 页执行
SELECT ... INTO OUTFILE(需 MySQL 有FILE权限),生成服务端文件,再通过 phpMyAdmin 的「导入」页读取那个文件——跳过了浏览器传输环节 - 禁用 phpMyAdmin 的「显示 BLOB 内容」选项(设置 → 右上角齿轮 → 「显示」→ 取消勾选
Show BLOB contents),避免 JSON 字段被当二进制渲染拖慢页面
导出 JSON 字段真正的难点不在操作步骤,而在验证环节——你永远要问一句:导入后,MySQL 认它为 JSON 吗?而不是“看起来像 JSON”。JSON_VALID() 是唯一可信的判据,其他都是幻觉。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











