4

我正在使用 Perl 的 DBI 和 SQLite 数据库(我安装了 DBD::SQLite)。我有以下代码:

my $dbh = DBI->connect("dbi:SQLite:dbname=$db", "", "", { RaiseError => 1, AutoCommit => 1 });
...
my $q = "INSERT OR IGNORE INTO books (identica, book_title) VALUES (?, ?)";
my $sth = $dbh->prepare($q);
$sth->execute($book_info->{identica}, $book_info->{book_title});

我遇到的问题是,当$book_info->{identica}它们以 0 开头时,它们会被删除,并且我在数据库中插入了一个数字。

例如,identicaof00123将转换为123.

我知道 SQLite 没有类型,那么如何让 DBI 插入identicaas 字符串而不是数字?

"$book_info->{identica}"我尝试在传递给时引用它,$sth->execute但这没有帮助。

编辑

即使我直接在查询中插入值它也不起作用:

my $i = $book_info->{identica};
my $q = "INSERT OR IGNORE INTO books (identica, book_title) VALUES ('$i', ?)";
my $sth = $dbh->prepare($q);
$sth->execute($book_info->{book_title});

这仍然转换00123123, 和...00000000099

编辑

天哪,我在命令行上做了这个,我得到了这个:

sqlite> INSERT INTO books (identica, book_title) VALUES ('0439023521', 'a');
sqlite> select * from books where id=28;
28|439023521|a|

它被 SQLite 删除了!

这是架构的外观:

CREATE TABLE books (
  id                INTEGER PRIMARY KEY AUTOINCREMENT,
  identica          STRING  NOT NULL,
);

CREATE UNIQUE INDEX IDX_identica       on books(identica);
CREATE INDEX IDX_book_title            on books(book_title);

有什么想法吗?

解决方案

这是 sqlite 问题,请参阅 Jim 的评论中的答案。STRING必须在TEXTsqlite中。否则它会将其视为数字!

将架构更改为以下解决了它:

CREATE TABLE books (
  id                INTEGER PRIMARY KEY AUTOINCREMENT,
  identica          TEXT  NOT NULL,
);
4

2 回答 2

3

使用绑定参数

my $sth = $dbh->prepare($q);
$sth->bind_param(1, 00123, { TYPE => SQL_VARCHAR });
$sth->bind_param(2, $book_info->{book_title});
$sth->execute();

更新:

阅读SQLite 中的类型亲和性。因为您的列类型是STRING(技术上不受支持),所以它默认为 INTEGER 亲和性。您需要改为创建列TEXT

于 2012-03-19T21:00:12.853 回答
1

根据文档,如果列类型(亲和力)是 TEXT 它应该将其存储为字符串;否则它将是一个数字。

于 2012-03-19T23:08:40.590 回答