从 perl 插入 mysql 时的 dup 条目

Posted

技术标签:

【中文标题】从 perl 插入 mysql 时的 dup 条目【英文标题】:dup entry when doing insert into mysql from perl 【发布时间】:2011-05-23 01:25:23 【问题描述】:

我正在从 perl 插入 mysql 数据库。第一次插入后出现重复错误。这是我用于插入的代码。我正在从 json 响应中提取一个 id。我在代码下方输出了我收到的内容

  foreach my $listing(@$json_text->listings)
    
      my $id = $listing->id;
   print "\nid = $id \n";


    # DO THE INSERT
    my $query_insert = "INSERT INTO calendar (id) VALUES ($id)";
    print "query insert = $query_insert \n";
    my $query = $db->do($query_insert); 
   print "query = $query \n";

     #end foreach

这是我收到的输出。 (返回没有正确复制。所以下面看起来不对,但正确的数据在那里)。这就像 133 我的 $query = $db->do($query_insert);

id = 2576246314 查询插入 = INSERT INTO 日历 (id) 值 (2576246314) 查询 = 1

id = 2576246678 查询插入 = INSERT INTO 日历 (id) 值 (2576246678) DBD::mysql::db 失败:./calendar_run.pl 第 133 行的键 'PRIMARY' 的重复条目 '2147483647'。 查询 =

id = 2576246781 查询插入 = INSERT INTO 日历 (id) 值 (2576246781) DBD::mysql::db 失败:./calendar_run.pl 第 133 行的键 'PRIMARY' 的重复条目 '2147483647'。 查询 =

id = 2576247610 查询插入 = INSERT INTO 日历 (id) 值 (2576247610) DBD::mysql::db 失败:./calendar_run.pl 第 133 行的键 'PRIMARY' 的重复条目 '2147483647'。 查询 =

id = 2576247737 查询插入 = INSERT INTO 日历 (id) 值 (2576247737) DBD::mysql::db 失败:./calendar_run.pl 第 133 行的键 'PRIMARY' 的重复条目 '2147483647'。 查询 =

id = 2576247756 查询插入 = INSERT INTO 日历 (id) 值 (2576247756) DBD::mysql::db 失败:./calendar_run.pl 第 133 行的键 'PRIMARY' 的重复条目 '2147483647'。 查询 =

id = 2576247766 查询插入 = INSERT INTO 日历 (id) 值 (2576247766) DBD::mysql::db 失败:./calendar_run.pl 第 133 行的键 'PRIMARY' 的重复条目 '2147483647'。 查询 =

id = 2576248369 查询插入 = INSERT INTO 日历 (id) 值 (2576248369) DBD::mysql::db 失败:./calendar_run.pl 第 133 行的键 'PRIMARY' 的重复条目 '2147483647'。 查询 =

id = 2576248388 查询插入 = INSERT INTO 日历 (id) 值 (2576248388) DBD::mysql::db 失败:./calendar_run.pl 第 133 行的键 'PRIMARY' 的重复条目 '2147483647'。 查询 =

id = 2576248660 查询插入 = INSERT INTO 日历 (id) 值 (2576248660) DBD::mysql::db 失败:./calendar_run.pl 第 133 行的键 'PRIMARY' 的重复条目 '2147483647'。 查询 =

id = 2576249706 查询插入 = INSERT INTO 日历 (id) 值 (2576249706) DBD::mysql::db 失败:./calendar_run.pl 第 133 行的键 'PRIMARY' 的重复条目 '2147483647'。 查询 =

id = 2576250254 查询插入 = INSERT INTO 日历 (id) 值 (2576250254) DBD::mysql::db 失败:./calendar_run.pl 第 133 行的键 'PRIMARY' 的重复条目 '2147483647'。 查询 =

【问题讨论】:

我们需要看看日历的表结构是什么样子的 请在您的代码中使用 DBI 占位符。现在任何人都可以通过在你的 JSON 中加入有趣的东西来 pwn 你的数据库。 search.cpan.org/~timb/DBI-1.616/… 【参考方案1】:

听起来 id 的类型太短了。该值 (2147683647) 是最大的有符号 32 位整数值。尝试为 id 使用更大的尺寸。

【讨论】:

【参考方案2】:

我在使用 DBD::MySQL 时遇到了同样的错误。这是我发现的:“Perl 将返回的值存储为字符串,但是当您在数字上下文中使用这些值时会自动将它们转换为数字。这将导致它们被“截断”为 2147483647,因为 Perl 使用有符号的 LONG 值来存储这些数字。” (这里:http://www.tol.it/doc/MySQL/chapter7.html)。 但我还没有发现任何公开的错误。

【讨论】:

以上是关于从 perl 插入 mysql 时的 dup 条目的主要内容,如果未能解决你的问题,请参考以下文章

如何处理错误:ER_DUP_ENTRY:nodejs 中的重复条目

插入另一个表时的MySQL触发器问题

perl dbi mysql 向表中插入数据速度很慢

导入大文件时的 MySQL 奇怪问题:键“PRIMARY”的重复条目

删除然后批量插入时的 SQL 死锁

Perl 脚本中的 CRUD cron 条目