调用Docker Exec REST API执行MySQL语句报1064语法错误如何解决
错误原因
你遇到的是多层字符串嵌套的单引号转义冲突:
- 你在
bash -c的参数中,用单引号包裹了mysql -e后面的SQL语句,但SQL语句内部的字段值又用了单引号,导致-e参数的外层单引号被提前闭合。 - 比如SQL中
VALUES ('54321'里的第一个单引号,直接和mysql -e '的起始单引号配对,后续SQL内容全部被截断为bash层面的普通字符串,最终传到MariaDB的SQL语法完全混乱,触发1064报错。
修正方案
方案1:转义单引号
在bash的单引号包裹语境中,要输出单引号需要用'\''格式转义(逻辑是:先结束当前单引号段,插入一个转义后的单引号,再重新开启单引号段包裹剩余内容)。修正后的请求体如下:
{ "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "DetachKeys": "ctrl-p,ctrl-q", "Tty": false, "Cmd": [ "/bin/bash","-c", "mysql -uroot -ptesttest -e 'INSERT INTO `mandator_1`.`terminal` (`serialNumber`, `name`, `isActive`, `status`, `profileId`, `businessId`, `divisionId`, `ipAddress`, `groupId`, `setupVersion`, `macAddress`, `authType`) VALUES ('\''54321'\'', '\''54321'\'', '\''1'\'', NULL, '\''1'\'', '\''1'\'', NULL, '\''172.45.17.197'\'', '\''1'\'', NULL, '\''E4-F1-D3-FD'\'', '\''2'\'');' mandator_1" ] }
方案2:替换字符串包裹符(更易维护)
把SQL里的字符串包裹符换成双引号,然后在JSON字符串里转义双引号即可,避免多层单引号嵌套的问题:
{ "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "DetachKeys": "ctrl-p,ctrl-q", "Tty": false, "Cmd": [ "/bin/bash","-c", "mysql -uroot -ptesttest -e 'INSERT INTO `mandator_1`.`terminal` (`serialNumber`, `name`, `isActive`, `status`, `profileId`, `businessId`, `divisionId`, `ipAddress`, `groupId`, `setupVersion`, `macAddress`, `authType`) VALUES (\"54321\", \"54321\", \"1\", NULL, \"1\", \"1\", NULL, \"172.45.17.197\", \"1\", NULL, \"E4-F1-D3-FD\", \"2\");' mandator_1" ] }
内容的提问来源于stack exchange,提问作者Sithys
相关产品推荐
相关产品推荐

