Navicat 16 不支持直接导出合法 PHP 数组,需经 CSV/JSON 中转+脚本转换;其“JSON”导出实为非法 JSONL 格式,字段名无引号、特殊字符未转义、无外层数组包裹,json_decode() 失败;推荐导出 UTF-8 编码 CSV(含表头、字段加双引号、反斜杠转义),再用 PHP 脚本生成 var_export() 数组。
Navicat 16 不支持直接导出为合法 PHP 数组,所谓“导出为 PHP 数组”必须经由中间格式(如 JSON 或 CSV)+ 外部脚本转换实现。界面里没有“PHP array”选项,强行选 JSON 导出的也不是标准 JSON,更不是 var_export() 或 print_r() 格式。
为什么 Navicat 16 导出的 JSON 不能直接当 PHP 数组用
它默认输出的是无引号字段名、不转义特殊字符、无外层数组包裹的类 jsonl 格式。例如:
{"id":1,name:"张三",note:"用户有'单引号'和
换行"}
这种内容 json_decode() 会失败,eval() 更危险且无法处理换行、单引号、Unicode 等——PHP 解析器直接报错 Parse error: syntax error。
- 字段名没双引号 → 不是合法 JSON
- 中文、单引号、换行符未转义 → PHP 字符串字面量非法
- 多行输出但无
[]包裹 → 无法用json_decode($str, true)得到数组
可行路径:先导出 CSV,再用 PHP 脚本生成 var_export() 数组
比折腾 JSON 更稳:CSV 字段明确、Navicat 对 CSV 的转义控制更可靠(尤其勾选了 Enclose fields with double quotes 和 Escape character: 时)。导出后用以下脚本转:
$rows = [];
$handle = fopen('users.csv', 'r');
$header = fgetcsv($handle);
while ($row = fgetcsv($handle)) {
$rows[] = array_combine($header, array_map(fn($v) => $v === '' ? null : $v, $row));
}
file_put_contents('users.php', '<?php return ' . var_export($rows, true) . ';');
- 确保 CSV 导出时勾选
Include column names as first row - 编码选
UTF-8,否则var_export()输出的中文会变成u{xxxx}或乱码 - 若字段含
NULL,Navicat 默认导出为空字符串,脚本中需显式转为null(如上例)
如果坚持用 JSON 中间格式,必须手动清洗再 json_decode()
仅适用于小数据量(
- 在 Navicat 导出向导中选
JSON格式,务必勾选:每行一条记录+使用双引号包裹字段名 - 导出后用 PHP 逐行读取,对每行做最小清洗:
str_replace([" ", " ", "'"], ['\n', '\r', "\'"], $line) - 拼成完整 JSON 数组字符串:
'[' . implode(',', $cleaned_lines) . ']',再json_decode($json, true) - 注意:时间字段(
DATETIME)会是"2024-03-15T09:22:33"字符串,不是DateTime对象,需后续转换
别踩坑:不要信“导出为 PHP”按钮或第三方插件
Navicat 16 官方界面里没有该功能;所谓“PHP 导出插件”多为旧版第三方脚本,不兼容 v16 的导出管道,且常绕过权限校验直接读内存,存在泄露风险。真正可控的方式只有:自己写转换脚本 + 用 Navicat 可靠导出格式(CSV 最优)作为输入源。
最易被忽略的一点:Navicat 导出 CSV 时若未勾选 Enclose fields with double quotes,遇到含逗号的字段(如地址栏),PHP fgetcsv() 会切错列——这比 JSON 解析失败更难排查。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











