mysql - 使用 Perl DBD 访问 MySQL 数据库 :ODBC

标签 mysql perl dbi

我是 MySQL 的新手,我正在尝试编写一个 Perl 脚本来访问我自己机器上的 MySQL 数据库(最终希望使用该脚本将数据从远程机器上的 SQL Server 数据库复制到远程机器上的 MySQL 数据库我自己的机器,但首先我需要让它访问我的服务器)。

我编写了以下在 MySQL Workbench 中运行良好的代码:

use test;

DROPTABLE IF EXISTS alerts;

请注意,我在这里将 DROPTABLE 写成一个单词,因为当我将它写成两个单词时,stackoverflow 不会让我发布它,而是给我一个错误。在实际代码中是 2 个字。如果有人可以编辑这个问题使其成为 2 个单词,请这样做,但是当我尝试编辑它时,我得到了与发布时相同的错误。

CREATE TABLE alerts (
    alertid INT NOT NULL,
    alertdttm DATE NOT NULL,
    alerttype VARCHAR(256) NOT NULL,
    userid INT NOT NULL,
    alerttext VARCHAR(1024) NULL
   );

但是,当我使用以下 Perl 脚本时出现错误:

$sql_my = <<'END_SQLmy';

use test;

DROPTABLE IF EXISTS alerts;

CREATE TABLE alerts (
    alertid INT NOT NULL,
    alertdttm DATE NOT NULL,
    alerttype VARCHAR(256) NOT NULL,
    userid INT NOT NULL,
    alerttext VARCHAR(1024) NULL
   );

END_SQLmy

$dbh2 = DBI->connect( "dbi:ODBC:MySQL57") || die "Cannot connect:     $DBI::errstr";
print "Connecting to MySQL database.\n";
$sth2 = $dbh2->prepare($sql_my);
$sth2->execute;

DBD::ODBC::st execute failed: [MySQL][ODBC 5.3(w) Driver][mysqld-5.7.9-log]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 'DROPTABLE IF EXISTS alerts;

我试了一下代码并将其更改为

my $table = "alerts1";
$dbh2 = DBI->connect($dsn, $user, $pw);
$dbh2->do("CREATE TABLE $table (column VARCHAR(17));"); 
$dbh2->disconnect;

这也连接得很好,但给我 CREATE TABLE 行的错误,

BDB::mysql::db do failed: You have an error in your SQL syntax; check the manual the corresponds to your MySQL server version for the right syntax to use near 'column VARCHAR{17))' at line 1 at testmysql.pl line 51.

所以我认为这就是我的语法错误的来源,但我不知道如何修复它。我检查了用户的权限,它似乎具有正确的权限,它可以很好地删除表,但无法创建它。但是,当我在 MySQL Workbench 中运行相同的查询时,它会创建表,所以我知道语法没问题。知道问题是什么吗? (仅供引用,我使用 MySQL 5.3 unicode 驱动程序使用本地主机、端口 3306 以及根用户和密码设置了 ODBC。我在 Windows 7 机器上。)

(此外,如果有人知道将数据从远程 SQL Server 复制到本地 MySQL 数据库的真正好方法,请随时插话。现在我想出的最好的主意是从中提取数据使用 Perl 访问远程机器,然后将其推送到本地数据库,希望我可以在一个快速脚本中完成。)

最佳答案

You have an error in your SQL syntax; [...] near 'DROPTABLE IF EXISTS alerts;

如错误所述,您的 SQL 无效。

DROPTABLE IF EXISTS alerts;

应该是

DROP TABLE IF EXISTS alerts;
    ^

You have an error in your SQL syntax; [...] near 'column VARCHAR{17))'

同样,

"CREATE TABLE $table (column VARCHAR{17));"

应该是

"CREATE TABLE $table (column VARCHAR(17));"
                                    ^

其实应该是

"CREATE TABLE ".$dbh->quote_identifier($table)." (column VARCHAR(17));"

关于mysql - 使用 Perl DBD 访问 MySQL 数据库 :ODBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33417714/

相关文章:

javascript - 使用 AngularJS 读取和处理 html

mysql - 如何检查 Perl 模块 (DBD::mysql) 是否正确安装?

c - RaiseError (PERL, DBI) 相当于 unixODBC C API?

mysql - 在 ruby​​ Rails 中分配外键

用于多寄存器嵌套标签的 Perl XML 编辑

perl - 使用 Fcntl : Baffling bug involving 'use' and 'require' 锁定文件

mysql - 如何提高从一个数据库服务器中选择 100 万多行并将它们插入到另一个数据库服务器的 Perl/DBI 脚本的性能?

php - 选择匹配 1 到多个字段的用户并删除重复项

html - 使用输入名称字段上传图像

MySQL将相似的记录分组,然后给出组总计