MySQL执行ALTER TABLE修改引擎与字符集时报1064错误,求助解决
问题描述
执行以下MySQL命令:
$ mysql -u user -pPassword db_name -e "ALTER TABLE `table_name` ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ;"
得到报错:
Error: failed_jobs: command not found mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' at line 1
已用反引号包裹table_name但仍报错;不包裹则仅出现密码不安全警告,操作始终失败。当前在Ubuntu 20.04系统上使用MySQL 8.0.41,尝试通过脚本同步数据库schema时受阻,询问如何解决及SQL语句是否存在问题。
解决方案
1. 修复shell解析反引号的问题
核心错误是bash等shell会把反引号`当作命令替换符号,它会尝试执行`table_name`里的内容(把你的实际表名failed_jobs当成系统命令去执行),这才触发了failed_jobs: command not found的错误,进而导致SQL语句被破坏。
解决方法二选一:
- 将SQL语句外层的双引号换成单引号,shell不会解析单引号内的反引号:
mysql -u user -pPassword db_name -e 'ALTER TABLE `table_name` ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;' - 对反引号进行转义,在每个反引号前加反斜杠
\:mysql -u user -pPassword db_name -e "ALTER TABLE \`table_name\` ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"
2. 确认SQL语句的正确性
你的SQL语句本身没有语法问题:
- MySQL 8.0完全支持
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci的写法; - 表名用反引号包裹是正确的,尤其是当表名是MySQL保留字(如
order、user)时,必须用反引号。
3. 优化密码输入方式(可选)
命令行明文输密码存在安全风险,推荐两种替代方式:
- 写入
~/.my.cnf配置文件(权限需设为600):
之后执行命令无需带密码参数:[client] user=user password=Passwordmysql db_name -e 'ALTER TABLE `table_name` ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;' - 使用环境变量
MYSQL_PWD:MYSQL_PWD=Password mysql -u user db_name -e 'ALTER TABLE `table_name` ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;'
内容的提问来源于stack exchange,提问作者Krish Patel
相关产品推荐
相关产品推荐

