我正在try 将GO变量传递到db.Exec中:

    pinakas := "dokimi03"
    crTable := `CREATE TABLE ? (id bigint(20) NOT NULL AUTO_INCREMENT, username varchar(100) NOT NULL, password varchar(100) NOT NULL, email varchar(100) NOT NULL, PRIMARY KEY (id));`

    _, errCreate := db.Exec(crTable, pinakas)
    if errCreate != nil {
        log.Println(errCreate)
    }

当我运行代码时,我从MySQL得到的错误是:

错误1064:您的SQL语法中有一个错误;请查看与您的MySQL服务器版本对应的手册,以了解要在第1行使用的正确语法‘?(ID Bigint(20)NOT NULL AUTO_INCREMENT,USERNAME VARCHAR(100)NOT NULL,PASWO’

如果我用dokimi03(表名)替换?,代码就会运行(当然,还要go 掉pinakas变量).

我已经搜索了文档,?似乎是在Go-MySQL上表示变量的合适字符.我遗漏了什么?

推荐答案

在MySQL中,?是合适的参数占位符,但不能将参数用作表标识符.

参数只能用来替代标量值,而不能用来替代标识符、SQL关键字或表达式等.

这不仅与MySQL相关,也不仅与Go连接器相关.它是SQL语言的每个实现中的标准(有一些连接器通过进行字符串替换来伪造参数,但MySQL的Go连接器不这样做).

在将表名传递给db.Exec()之前,表名必须固定在SQL字符串中.

例如,我会这样写:

pinakas := "dokimi03"
crTable := fmt.Sprintf("CREATE TABLE `%s` (id bigint(20) NOT NULL AUTO_INCREMENT, username varchar(100) NOT NULL, password varchar(100) NOT NULL, email varchar(100) NOT NULL, PRIMARY KEY (id))", pinakas)

Mysql相关问答推荐

如何让Docker MySQL使用Unicode(utf-8)和初始化脚本?

MySQL嵌套的内连接使查询变得很慢-解决方案?

在 .NET 6 中使用 Dapper Framework 未能成功连接到 MySql

数据导入和默认目标架构空列表. (Mysql 工作台 8)

根据 JOIN 结果计算列中的值?

创建 mySQL BEFORE/AFTER UPDATE 触发器

如何优化使用多个 LEFT JOIN 和 GROUP BY 子句的慢速 MySQL 查询?

如何查询由另一个查询创建的表?

MySQL 根据另一列中的值更改空值

MySQL 1292 截断不正确的日期时间值:'2020-09-11T08:32-50Z'

在 Presto Athena 中将字符串转换为数组

为什么 ORDER BY 'id' 'desc' 不返回语法错误?

Python MYSQL 更新语句

如何通过 mysql workbench 将数据导入 mysql 数据库?

MAMP mysql 服务器无法启动.没有mysql进程正在运行

使用 PHP 和 MySQL 存储和显示 unicode 字符串 (हिन्दी)

如何在 python 中逐行获取 MySQL ResultSet

MySQL 在每个唯一值第一次出现时 Select 行

如何计算表格的列数

使用 Docker 我收到错误:SQLSTATE[HY000] [2002] 没有这样的文件或目录