【问题标题】:Perl dbi prepare is putting wrong quotePerl dbi prepare 引用错误
【发布时间】:2015-09-23 17:02:44
【问题描述】:

我的代码与下面类似:

$sth = $dbh->prepare("CREATE TABLE IF NOT EXISTS ? (`id` bigint(100) unsigned NOT NULL AUTO_INCREMENT");
$sth->execute('test');

我最终得到了错误:

ERROR 1064 (42000): 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 ''test'

从跟踪中我发现 perl DBI 在表名周围加上单引号,这是 mysql 不喜欢的。如何告诉 DBI 不要放任何引号或放 (`) 而不是单引号?

【问题讨论】:

    标签: mysql perl dbi


    【解决方案1】:

    它只是按照你的要求做。当给定一个字符串时,? 等效于字符串文字。所以

    SELECT * FROM Table WHERE field = ?
    

    意思

    SELECT * FROM Table WHERE field = 'test'
    

    SELECT * FROM ?
    

    意思

    SELECT * FROM 'test'
    

    你需要使用

    $dbh->prepare("
       CREATE TABLE IF NOT EXISTS ".( $dbh->quote_identifier('test') )." (
                 `id` bigint(100) unsigned NOT NULL AUTO_INCREMENT
              )
    ");
    

    【讨论】:

    • @user3360140 对。请参阅 DBI 文档中的Placeholders and Bind Values,其中说:对于大多数驱动程序,占位符不能用于语句的任何元素,这会阻止数据库服务器验证语句并为其创建查询执行计划。
    • 或者查看 MySQL 文档,该文档不允许在 CREATE TABLE 语句中使用表名的任意表达式。
    【解决方案2】:

    您不能为表或列名使用占位符。 PreparedStatement 会将此值解释为一个字符串,并在其周围加上单引号。

    【讨论】:

    • 在我的代码中,我创建了具有相同架构的新表。这就是为什么我试图通过创建表查询来提高效率。还有什么办法可以吗?
    • @user3360140 仅与字符串连接
    猜你喜欢
    • 2012-09-21
    • 2014-12-12
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 2023-04-10
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多