Error
EXTRA *mysql.MySQLError=Error 1064: 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 ‘? (
然而我仔细看了看sql语句,没有看出来究竟哪里有sql报错。
然而当我把作为placeholder的问号去掉,直接用表的名字,sql是可以直接执行的。我意识到这个可能是和placeholder有关。
搜索了一下,看到一个链接 https://github.com/go-sql-driver/mysql/issues/848
Placeholder can’t be used for table name or column name. It’s MySQL spec. Not bug of this project.
大意是说,placeholder是不能作为表名或者列名的。
在mysql关于prepared文档介绍中,在允许使用prepared的语句里,没有看到create table可以用placeholder https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html
prepared语句的优点有以下几个
- 优化查询速度
- 防止sql注入
但是也有一些限制
- 不是所有语句都能用prepared语句。常见的用法应该是作为select where之后的条件,或者INSERT语句之后的值
- 不支持一个sql中多条查询语句的形式