通过Perl'将字符串插入数据库时转换为数字;s DBI$sth->;execute()函数
我正在使用Perl的DBI和SQLite数据库(我已经安装了DBD::SQLite)。我有以下代码:通过Perl'将字符串插入数据库时转换为数字;s DBI$sth->;execute()函数,perl,sqlite,type-conversion,dbi,dbd,Perl,Sqlite,Type Conversion,Dbi,Dbd,我正在使用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-
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开头时,它们会被删除,而我会在数据库中插入一个数字
例如,00123
的identica
将转换为123
我知道SQLite没有类型,那么如何使DBI将identica
作为字符串而不是数字插入呢
当传递到$sth->execute
时,我尝试将其引用为“$book\u info->{identica}”
,但这没有帮助
编辑
即使我直接在查询中插入值,它也不起作用:
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评论中的答案。字符串
必须是sqlite中的文本
。否则它会将其视为数字
将架构更改为以下解决方案:
CREATE TABLE books (
id INTEGER PRIMARY KEY AUTOINCREMENT,
identica TEXT NOT NULL,
);
使用
更新:
了解。因为您的列类型是
STRING
(技术上不支持),所以它默认为整数关联。您需要将列创建为TEXT
。根据文档,如果列类型(关联)为TEXT,则应将其存储为字符串;否则它将是一个数字。该列在SQLite中的声明(即类型关联)是什么?根据文档,如果是文本
,则应将其存储为字符串;否则它将是一个数字。@JimGarrison请查看更新的问题。我正在使用字符串
。让我试试TEXT
@JimGarrison你刚刚救了我一天。我将其转换为文本
,效果非常好!我发布了我的建议作为回答。注意,在sqlite中,不需要integer主键自动递增
——每个表都有一个隐式rowid
列。谢谢您的回答。我试过了,但没用。我做了更多的实验,请看我更新的问题。看起来sqlite3正在删除前导0的全部内容!谢谢请留下你的原始答案,因为它也是有洞察力的。请结合两个答案!将原始答案添加回。祝你好运。
my $sth = $dbh->prepare($q);
$sth->bind_param(1, 00123, { TYPE => SQL_VARCHAR });
$sth->bind_param(2, $book_info->{book_title});
$sth->execute();