必须确认目标mysql版本≥5.7.8,因json类型自该版本起原生支持,低版本如5.6会因不认识json关键字而报error 1064语法错误。

导入前必须确认目标 MySQL 版本是否原生支持 JSON
phpMyAdmin 5.2 本身不解析或校验 SQL 中的 JSON 字段,它只是把文件内容原样发给 MySQL 服务端执行。所以关键不在 phpMyAdmin,而在你连的 MySQL 实例——JSON 类型从 MySQL 5.7.8 才正式引入,5.6 及更早版本压根不认识 JSON 关键字,会直接报错 ERROR 1064 (42000): You have an error in your SQL syntax。
检查方法:在 phpMyAdmin 的「SQL」页执行 SELECT VERSION();,看返回值。若低于 5.7.8,就别硬导含 data JSON 定义的建表语句,得先降级字段类型。
- MySQL 5.7.8+:可直接导入,但注意导出时是否带了 8.0+ 专属特性(如
DEFAULT (JSON_OBJECT())) - MySQL 5.6 或更低:必须手动把
JSON改成TEXT,并删掉所有DEFAULT后面的 JSON 函数调用 - 如果 SQL 文件里有
CREATE FUNCTION且用了JSON_EXTRACT等函数,也要确认目标版本是否支持——5.7.13 才开始支持JSON_EXTRACT
导入失败报 “Unknown collation: 'utf8mb4_0900_as_cs'” 怎么办
这是 MySQL 8.0+ 导出的典型症状,即使你的 SQL 里没显式写 JSON,只要用了 8.0 默认字符集和排序规则,就会在 CREATE TABLE 语句中带上 COLLATE utf8mb4_0900_as_cs 这类低版本不认识的值。
打开 SQL 文件,全局搜索替换以下内容:
-
utf8mb4_0900_as_cs→utf8mb4_unicode_ci -
utf8mb4_0900_ai_ci→utf8mb4_general_ci - 所有
DEFAULT COLLATE和COLLATE后面的值都要覆盖,包括出现在CREATE DATABASE行里的 - 若目标是 MySQL 5.6,还得把所有
utf8mb4替换为utf8(注意:会丢失 emoji 支持)
导入含 JSON 默认值的语句时报错 “This function has none of DETERMINISTIC...”
MySQL 8.0 要求函数(包括 JSON_OBJECT()、JSON_ARRAY())在创建存储过程或触发器时必须声明 DETERMINISTIC 或 NO SQL,但很多导出的 SQL 文件里直接写了 data JSON DEFAULT (JSON_OBJECT()),这在 5.7 是非法语法。
处理方式分两种场景:
- 只是建表语句:删掉整个
DEFAULT (JSON_OBJECT())部分,保留data JSON即可;插入时再用应用层构造 JSON 字符串 - 涉及存储过程/函数:必须补上
DETERMINISTIC声明,例如CREATE FUNCTION json_default() RETURNS JSON DETERMINISTIC RETURN JSON_OBJECT(); - 如果只是想让字段可空,改用
data JSON NULL DEFAULT NULL更安全
导入后 JSON 字段显示为 NULL 或乱码
不是字段定义问题,而是数据插入时的字符集不匹配。常见于从 UTF-8 编码的 SQL 文件导入到连接字符集为 latin1 的会话中,JSON 字符串里的双引号、花括号会被截断或转义异常。
确保三处统一为 utf8mb4:
- SQL 文件保存编码:用 VS Code 或 Notepad++ 确认为 UTF-8 without BOM
- phpMyAdmin 连接字符集:顶部状态栏应显示
Connection: utf8mb4;若不是,先执行SET NAMES utf8mb4;再导入 - 目标表字段定义:
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
最易被忽略的是连接字符集——很多人改了表和文件编码,却忘了 phpMyAdmin 当前会话还是 latin1,结果 JSON 字符串开头就被截掉几个字节,后续全乱。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











