我正在使用 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 开头时,它们会被删除,并且我在数据库中插入了一个数字。
例如,identica
of00123
将转换为123
.
我知道 SQLite 没有类型,那么如何让 DBI 插入identica
as 字符串而不是数字?
"$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});
这仍然转换00123
为123
, 和...0000000009
9
编辑
天哪,我在命令行上做了这个,我得到了这个:
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
必须在TEXT
sqlite中。否则它会将其视为数字!
将架构更改为以下解决了它:
CREATE TABLE books (
id INTEGER PRIMARY KEY AUTOINCREMENT,
identica TEXT NOT NULL,
);