Shopware数据库导入时order表报GENERATED ALWAYS AS语法错误
报错原因
这个错误和表内的订单数据完全无关,报错发生在CREATE TABLE建表阶段,你删订单数据的操作对解决这个问题没有任何作用。
核心原因是SQL语法和目标数据库版本不兼容:
- 你导出的建表语句是MySQL 8.0的写法,允许将字段的
COLLATE(排序规则)属性写在GENERATED ALWAYS AS生成列定义之前。 - 如果你的目标数据库是MySQL 5.7、10.5及以下版本的MariaDB,语法解析器不支持这种属性顺序,解析到第一个带
COLLATE前缀的生成列tax_status时就会抛出1064语法错误,和你看到的报错位置完全吻合。 - 部分旧版本phpMyAdmin导出时还可能存在生成列表达式内单引号转义错误的问题,但你贴出的SQL不存在这个问题。
解决方法
按优先级从高到低选择:
- 优先方案:对齐数据库版本
Shopware 6官方运行要求就是MySQL 8.0.17及以上版本,低版本数据库本身就不满足程序运行要求。直接将目标数据库升级到和源库一致的MySQL 8.0版本,之后重新导入原始SQL文件即可,不需要做任何修改。 - 临时方案:修改SQL文件的生成列定义顺序
如果暂时无法升级数据库,打开导出的SQL文件,找到order表的建表语句,把所有生成列的COLLATE子句移动到VIRTUAL/STORED关键字之后即可。
比如报错的tax_status字段原写法:
修改为兼容低版本的写法:`tax_status` varchar(255) COLLATE utf8mb4_unicode_ci GENERATED ALWAYS AS (json_unquote(json_extract(`price`,'$.taxStatus'))) VIRTUAL,
检查同一张表内其他生成列,按相同规则调整后保存,重新导入即可。`tax_status` varchar(255) GENERATED ALWAYS AS (json_unquote(json_extract(`price`,'$.taxStatus'))) VIRTUAL COLLATE utf8mb4_unicode_ci, - 替代方案:使用命令行导出导入
可以直接绕过phpMyAdmin的导出逻辑,用MySQL原生命令行工具导出导入,不会出现语法兼容问题:- 源服务器执行导出命令:
mysqldump -u源库用户名 -p源库密码 源数据库名 > shopware_backup.sql - 目标服务器执行导入命令:
mysql -u目标库用户名 -p目标库密码 目标数据库名 < shopware_backup.sql
- 源服务器执行导出命令:
注意:手动修改SQL兼容低版本数据库仅能解决导入问题,后续Shopware运行过程中仍可能出现其他数据库兼容报错,长期使用必须升级到符合要求的数据库版本。
内容的提问来源于stack exchange,提问作者Grimclaw Draven
相关产品推荐
相关产品推荐

