通过Perl的DBI $sth-> execute()函数将字符串插入数据库时??
发布时间:2020-12-16 06:16:54 所属栏目:大数据 来源:网络整理
导读:我正在使用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
我正在使用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开头时,它们会被删除,我会在数据库中插入一个数字. 例如,00123的identica将转换为123. 我知道SQLite没有类型,那么如何让DBI将identica作为字符串而不是数字插入? 我在传递给$sth->执行时尝试将其引用为“$book_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的评论中的回答. STRING必须是sqlite中的TEXT.否则它将其视为数字! 将模式更改为以下解决方案: CREATE TABLE books ( id INTEGER PRIMARY KEY AUTOINCREMENT,identica TEXT NOT NULL,); 解决方法
使用
bind params
my $sth = $dbh->prepare($q); $sth->bind_param(1,00123,{ TYPE => SQL_VARCHAR }); $sth->bind_param(2,$book_info->{book_title}); $sth->execute(); 更新: 阅读有关type affinity in SQLite.由于您的列类型为STRING(技术上不受支持),因此默认为INTEGER亲缘关系.您需要将列创建为TEXT. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |